Skip to content

chore(release): promote staging to production for v1.3.0 - #888

Merged
jirhiker merged 217 commits into
productionfrom
staging
Aug 24, 2026
Merged

chore(release): promote staging to production for v1.3.0#888
jirhiker merged 217 commits into
productionfrom
staging

Conversation

@jirhiker

Copy link
Copy Markdown
Member

Promotion of staging to production for the 1.3.0 stable release.

Checkpoint: prerelease v1.3.0-rc,
cut from this same staging state.

Prerequisite already landed: #887 back-merged the v1.2.1 hotfix into
staging (the manual forward-merge step from the hotfix flow had been
skipped), so v1.2.1 is in staging history and the staging manifest reads
1.2.1.

Merging this makes release-please open chore(production): release 1.3.0;
merging that tags v1.3.0 and deploys production.

Post-deploy, by hand: registered data migrations have no CD path (CD runs
alembic only). This release includes feat(data-migrations): publish existing project_areas.

ksmuczynski and others added 30 commits July 15, 2026 13:57
test_get_project_area assumed its "Test Group Foo" fixture would always get database id 1, which only held because nothing else in the suite created a Group row first. Any earlier-running test that inserts a Group (e.g. a data-migration test) shifts the sequence and breaks this test with an unrelated 404.

Use the fixture's actual group.id instead of the literal 1.
pyproject.toml's explicit setuptools packages list omitted data_migrations, so the installed `oco` CLI couldn't import it at all -- `oco data-migrations status/run` failed with ModuleNotFoundError for every migration, not just new ones. Running via `uv run pytest`/`python -c` masked this because pytest prepends the repo root to sys.path; the installed console-script entry point does not.
The upcoming ogc_* view filter excludes non-public records, and nine currently-passing tests in test_ogc.py assert that rows backed by the shared location/water_well_thing/group fixtures ARE present in ogc_* responses. Their "draft" default was an arbitrary safe value, not a deliberate test input -- confirmed by grepping the suite for anything that depends on it being specifically "draft".

Flips the three fixtures plus one inline Group(...)construction in test_ogc.py that bypassed the fixture.
Every ogc_* view/materialized view selected release_status but never filtered on it, so the unauthenticated /ogcapi endpoints have been serving private and draft records alongside public ones (e.g. water_wells: 1,145 private + 140 draft rows next to 8,678 public).

Adds "AND release_status = 'public'" to all 21 existing ogc_* relations and introduces ogc_locations (previously the locations collection pointed straight at the raw location table, which has no filter at all). ogc_actively_monitored_wells gets no predicate of its own -- it already inherits public-only rows transitively through its join to ogc_water_well_summary; adding a redundant filter on status_history.release_status would repeat a mistake already made and reverted once (see w1x2y3z4a5b6), since that column is never populated by the transfer scripts.

Fully reversible: downgrade() rebuilds the same relations with the byte-identical unfiltered SQL that was in production before this migration (ogc_locations is the exception, since it didn't exist pre-migration -- downgrade drops it rather than recreating it unfiltered).

Repoints core/pygeoapi-config.yml's locations provider at the new view in the same commit, since shipping the view without the config change (or vice versa) leaves the collection either unfiltered or broken.

Layer visibility (which collections are published)is unchanged. That's separate, out-of-scope work.
ogc_project_areas is now filtered to public records, but all 56 current project_area-bearing group rows are release_status=draft (confirmed in docs/ogc-layer-audit.md), which would make the layer return zero rows until someone flips them.

Uses the data_migrations framework (not Alembic, which is schema-only in this repo) so the change is tracked, skip-if-applied, and gated on this ticket's schema revision having landed first. Runs independently via `oco data-migrations run 20260714_0001_publish_project_areas` -- deliberately not swept in via run-all, which could also apply other unrelated pending migrations. No downgrade: this framework is forward-only, and a blanket revert couldn't tell rows this migration published apart from ones published independently afterward -- undoing it later means writing a new, deliberate migration instead.

This is a genuine publication decision, not a mechanical schema change -- confirm the 56 rows are actually appropriate for public release before merging.
Covers the migration-application, downgrade-reversibility, already-consistent-layers, and project_areas scenarios in ogc-cleanup-sprint1.feature tagged @A1. The other ~10 tickets sharing that feature file have no steps yet and stay undefined, per plan.

Tags @production only on these specific scenarios (the feature file has no feature-level tag since ~20 other tickets' scenarios share it) and @migration-mutates-schema on the three that call alembic downgrade, wiring a before/after_scenario hook in environment.py that unconditionally restores head so a downgrade left mid-scenario can't leak into later scenarios sharing this database.
pygeoapi is mounted via a raw Starlette Mount, so FastAPI's Depends() machinery never runs for it -- auth has to happen at the ASGI layer, in front of the mount, not as a route dependency.

Added TokenInvalid and decode_token_payload() alongside the existing _get_token_payload so the same JWKS/jwt.decode logic can be reused from code with no FastAPI exception handler watching (raising HTTPException there would just be an unhandled exception, not a response).

InternalOGCAuthMiddleware is a plain ASGI middleware class rather than BaseHTTPMiddleware (used elsewhere in this app for request logging and lazy admin init): BaseHTTPMiddleware buffers the full response body and breaks client-disconnect propagation, which matters here since this mount serves paginated GeoJSON up to max_items: 10000.

Splits 401 (no/invalid token) from 403 (valid token, wrong group) per the acceptance criteria, rather than collapsing both into 401 like every other auth path in this app does today -- the underlying check is identical either way, so the split is a one-line branch, not meaningfully more code to maintain.
Generalized _mount_path()/_pygeoapi_dir()/_write_config() to take an env var and default rather than hardcoding the public mount's values, so the internal mount gets the same traversal/character safety and sensitive-file handling for free instead of a copy-pasted second implementation.

mount_pygeoapi_internal() gets its own guard flag and runtime dir so it can't silently no-op against the public mount's state, and a startup check that the two configured mount paths actually differ -- Starlette doesn't error on duplicate Mounts, it just routes to whichever registered first, which would leave the internal mount silently unreachable rather than failing loudly.

Also added _assert_server_settings_match(): pygeoapi.api.API mutates process-wide globals (CHARSET, FORMAT_TYPES) during __init__, so whichever of the two mounts is built last wins for both. Inert today since both configs agree on encoding/gzip, but this fails startup loudly instead of letting a future divergence between the two configs silently corrupt responses on whichever mount lost the race.
Mirrors all 22 ogc_* relations f4a5b6c7d8e9 filters, as ogc_internal_* counterparts with no release_status predicate, so /ogcapi-internal can serve private/draft records to authenticated staff. Reuses f4a5b6c7d8e9's parametrized builder functions (public_only kept in the signature and always passed False) for structural parity rather than a differently-shaped rewrite, since that's what the drift-detection test in the next commit diffs against.

This repo keeps migrations self-contained with no cross-migration imports, so the two chemistry views' analyte-mapping CASE blocks are duplicated here rather than shared via a helper module -- a shared module would mean a future edit to one ticket's migration silently changes what the other replays from scratch. Added a one-line cross-reference comment in both files pointing at each other and the parity test.

ogc_internal_locations has no release_status predicate at all (unlike ogc_locations, which is always public-only even on its own downgrade path) since it never existed in any filtered form before this migration. downgrade() simply drops all 22 relations rather than restoring a prior state, since none of them existed before this migration.
The major/minor chemistry CASE blocks now exist in two files (f4a5b6c7d8e9 and 2d3c3a268652) because migrations can't import from each other. Without a check, a future analyte-mapping fix applied to the public view (e.g. reported against a public-facing bug) has no reason to also touch the internal view sitting in a different file from a different ticket -- silently leaving internal staff looking at the stale mapping, which inverts who has the more reliable data.

Compares AST source segments rather than raw text/regex so the comparison survives incidental formatting differences and only fails on a genuine logic change. Normalizes the one expected difference (the view name embedded in the CREATE statement) before comparing.
Tags the 6 A11 scenarios A1 already wrote into this shared feature file with @production, appended to their existing tag lines rather than at the feature level -- this file has no feature-level tag since it's shared across ~10 other tickets' scenarios, and tagging at that level would pull in every other ticket's undefined steps.

The 401/403/200 auth scenarios neutralize the ambient AUTHENTIK_DISABLE_AUTHENTICATION dev-bypass for their own duration only (restored via context.add_cleanup) and patch core.permissions.decode_token_payload directly, since no real Authentik server is available in CI to issue a genuine JWT. Existing auth-testing infrastructure in this repo only reaches app.dependency_overrides, which has zero effect on ASGI middleware -- none of it exercises InternalOGCAuthMiddleware for free.
…to-staging-1.2.0

chore: merge production v1.2.0 into staging
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 8.3.2 to 9.0.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@v8.3.2...v9.0.0)

---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
  dependency-version: 9.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
…or-and-patch group (#793)

Bumps the gha-minor-and-patch group with 1 update:
[actions/checkout](https://github.com/actions/checkout).

Updates `actions/checkout` from 7.0.0 to 7.0.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/actions/checkout/releases">actions/checkout's
releases</a>.</em></p>
<blockquote>
<h2>v7.0.1</h2>
<h2>What's Changed</h2>
<ul>
<li>skip running unsafe pr check if input is default by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2518">actions/checkout#2518</a></li>
<li>trim only ascii whitespace for branch by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2521">actions/checkout#2521</a></li>
<li>escape values passed to --unset by <a
href="https://github.com/aiqiaoy"><code>@​aiqiaoy</code></a> in <a
href="https://redirect.github.com/actions/checkout/pull/2530">actions/checkout#2530</a></li>
<li>Various dependency updates</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/actions/checkout/compare/v7...v7.0.1">https://github.com/actions/checkout/compare/v7...v7.0.1</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/actions/checkout/compare/v7...v7.0.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=actions/checkout&package-manager=github_actions&previous-version=7.0.0&new-version=7.0.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the uv-non-major group with 18 updates:

| Package | From | To |
| --- | --- | --- |
| [aiohttp](https://github.com/aio-libs/aiohttp) | `3.14.1` | `3.14.3` |
| [annotated-types](https://github.com/annotated-types/annotated-types)
| `0.7.0` | `0.8.0` |
| [cachetools](https://github.com/tkem/cachetools) | `7.1.4` | `7.1.6` |
| [certifi](https://github.com/certifi/python-certifi) | `2026.6.17` |
`2026.7.22` |
|
[cloud-sql-python-connector](https://github.com/GoogleCloudPlatform/cloud-sql-python-connector)
| `1.20.4` | `1.21.0` |
| [fastapi](https://github.com/fastapi/fastapi) | `0.139.2` | `0.140.2`
|
| [google-api-core](https://github.com/googleapis/google-cloud-python) |
`2.32.0` | `2.33.0` |
| [google-auth](https://github.com/googleapis/google-cloud-python) |
`2.56.0` | `2.56.2` |
| [greenlet](https://github.com/python-greenlet/greenlet) | `3.5.3` |
`3.5.4` |
| [phonenumbers](https://github.com/daviddrysdale/python-phonenumbers) |
`9.0.34` | `9.0.35` |
| [proto-plus](https://github.com/googleapis/google-cloud-python) |
`1.28.1` | `1.28.2` |
| [pytz](https://github.com/stub42/pytz) | `2026.2` | `2026.3.post1` |
| [scramp](https://github.com/tlocke/scramp) | `1.4.12` | `1.4.15` |
| [sentry-sdk[fastapi]](https://github.com/getsentry/sentry-python) |
`2.66.0` | `2.66.1` |
| [pre-commit](https://github.com/pre-commit/pre-commit) | `4.6.0` |
`4.6.1` |
|
[google-api-python-client](https://github.com/googleapis/google-api-python-client)
| `2.184.0` | `2.198.0` |
| [filelock](https://github.com/tox-dev/py-filelock) | `3.31.1` |
`3.32.0` |
| [sentry-sdk](https://github.com/getsentry/sentry-python) | `2.66.0` |
`2.66.1` |

Updates `aiohttp` from 3.14.1 to 3.14.3
Updates `annotated-types` from 0.7.0 to 0.8.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/annotated-types/annotated-types/releases">annotated-types's
releases</a>.</em></p>
<blockquote>
<h2>v0.8.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Rename DocInfo to Doc by <a
href="https://github.com/zen-xu"><code>@​zen-xu</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/80">annotated-types/annotated-types#80</a></li>
<li>Add support for Python 3.13 by <a
href="https://github.com/hugovk"><code>@​hugovk</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/83">annotated-types/annotated-types#83</a></li>
<li>Fix docstring of <code>Timezone</code> by <a
href="https://github.com/Viicos"><code>@​Viicos</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/84">annotated-types/annotated-types#84</a></li>
<li>Update license-files to be PEP-639 compliant (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/85">#85</a>)
by <a href="https://github.com/shoeffner"><code>@​shoeffner</code></a>
in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/86">annotated-types/annotated-types#86</a></li>
<li>fix: typo in README.md by <a
href="https://github.com/camiloaz"><code>@​camiloaz</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/87">annotated-types/annotated-types#87</a></li>
<li>add CI for PyPy3.11 and fix test (issue 71) by <a
href="https://github.com/mattip"><code>@​mattip</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/88">annotated-types/annotated-types#88</a></li>
<li>Fix string predicate names in doc by <a
href="https://github.com/leogermond"><code>@​leogermond</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/90">annotated-types/annotated-types#90</a></li>
<li>Add SPDX license expression by <a
href="https://github.com/wichert"><code>@​wichert</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/92">annotated-types/annotated-types#92</a></li>
<li>Added Python 3.14 to the test matrix by <a
href="https://github.com/imtoopunkforyou"><code>@​imtoopunkforyou</code></a>
in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/96">annotated-types/annotated-types#96</a></li>
<li>Add support for Python 3.14 and drop EOL 3.8-3.9 by <a
href="https://github.com/hugovk"><code>@​hugovk</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/97">annotated-types/annotated-types#97</a></li>
<li>Fix typo in <code>Len</code> docstring by <a
href="https://github.com/Dutcho"><code>@​Dutcho</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/100">annotated-types/annotated-types#100</a></li>
<li>Prepare for 0.8.0 release by <a
href="https://github.com/adriangb"><code>@​adriangb</code></a> in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/103">annotated-types/annotated-types#103</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/zen-xu"><code>@​zen-xu</code></a> made
their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/80">annotated-types/annotated-types#80</a></li>
<li><a href="https://github.com/hugovk"><code>@​hugovk</code></a> made
their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/83">annotated-types/annotated-types#83</a></li>
<li><a href="https://github.com/shoeffner"><code>@​shoeffner</code></a>
made their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/86">annotated-types/annotated-types#86</a></li>
<li><a href="https://github.com/camiloaz"><code>@​camiloaz</code></a>
made their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/87">annotated-types/annotated-types#87</a></li>
<li><a href="https://github.com/mattip"><code>@​mattip</code></a> made
their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/88">annotated-types/annotated-types#88</a></li>
<li><a
href="https://github.com/leogermond"><code>@​leogermond</code></a> made
their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/90">annotated-types/annotated-types#90</a></li>
<li><a href="https://github.com/wichert"><code>@​wichert</code></a> made
their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/92">annotated-types/annotated-types#92</a></li>
<li><a
href="https://github.com/imtoopunkforyou"><code>@​imtoopunkforyou</code></a>
made their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/96">annotated-types/annotated-types#96</a></li>
<li><a href="https://github.com/Dutcho"><code>@​Dutcho</code></a> made
their first contribution in <a
href="https://redirect.github.com/annotated-types/annotated-types/pull/100">annotated-types/annotated-types#100</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/annotated-types/annotated-types/compare/v0.7.0...v0.8.0">https://github.com/annotated-types/annotated-types/compare/v0.7.0...v0.8.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/9eb96680138269811a39d838d720abc3dce33954"><code>9eb9668</code></a>
Prepare for 0.8.0 release (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/103">#103</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/10b77644f88b385357653730a1ab23748ca3ae2e"><code>10b7764</code></a>
Fix typo in <code>Len</code> docstring (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/100">#100</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/955f7576d616feb6e9407c74498517787c38afd4"><code>955f757</code></a>
Add support for Python 3.14 and drop EOL 3.8-3.9 (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/97">#97</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/bd280fea7983550d266f993d868b8dd7ff822bf1"><code>bd280fe</code></a>
Added Python 3.14 to the test matrix (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/96">#96</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/a471bb757663452459893e6f593118ec21eb1b9e"><code>a471bb7</code></a>
Add SPDX license expression (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/92">#92</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/eab91d9a8c0d3f73661fc4b0794a1fe76c94fa84"><code>eab91d9</code></a>
Fix string predicate names in doc (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/90">#90</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/03ad9c3c7b4d4dfe9e33c09075a3a2766c0820e1"><code>03ad9c3</code></a>
add CI for PyPy3.11 and fix test (issue 71) (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/88">#88</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/5ae60437f0ab493cedd27311bc6ce6d2188e8d8b"><code>5ae6043</code></a>
fix: typo in README.md (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/87">#87</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/b60ad7bff90019c7de3547df1c8e3586eb328423"><code>b60ad7b</code></a>
Update license-files to be PEP-639 compliant (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/85">#85</a>)
(<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/86">#86</a>)</li>
<li><a
href="https://github.com/annotated-types/annotated-types/commit/3fbeb6d129760ae48d7a0372fb9301764acc95ae"><code>3fbeb6d</code></a>
Fix docstring of <code>Timezone</code> (<a
href="https://redirect.github.com/annotated-types/annotated-types/issues/84">#84</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/annotated-types/annotated-types/compare/v0.7.0...v0.8.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `cachetools` from 7.1.4 to 7.1.6
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst">cachetools's
changelog</a>.</em></p>
<blockquote>
<h1>v7.1.6 (2026-07-24)</h1>
<ul>
<li>Minor style improvements to keep <code>ruff</code> happy.</li>
</ul>
<h1>v7.1.5 (2026-07-23)</h1>
<ul>
<li>
<p>Fix <code>TLRUCache</code> silently keeping stale values on expired
overwrites.</p>
</li>
<li>
<p>Reject negative cache item <code>getsizeof</code> values.</p>
</li>
<li>
<p>Update build environment.</p>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/tkem/cachetools/commit/13bb86a55e36e501cf0b3e4c35db516ed9409fd7"><code>13bb86a</code></a>
Minor style improvements to keep ruff happy.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/e2250be46b9d8ed76b82c1c18a4465c0b1167b8a"><code>e2250be</code></a>
Fix RTD version handling.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/0d2a6ea17b3627bcf334c7360a8abe5889dd6235"><code>0d2a6ea</code></a>
Release v7.1.5.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/d64cf805de3c35feac4d2acc0d9d092bd9afd77e"><code>d64cf80</code></a>
Prepare v7.1.5.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/fcbb0de97fc09de646d2e210def765d07dee66e8"><code>fcbb0de</code></a>
Fix <a
href="https://redirect.github.com/tkem/cachetools/issues/406">#406</a>:
Merge branch 'gaoflow-fix-tlru-overwrite-expired-stale-value' into
...</li>
<li><a
href="https://github.com/tkem/cachetools/commit/c0fdf6abab38040947d6fe2e38c507401d5e2350"><code>c0fdf6a</code></a>
Fix TLRUCache silently keeping stale value on expired overwrite</li>
<li><a
href="https://github.com/tkem/cachetools/commit/978d34d40cdbf3b4cbfce104f3166032cc4ea028"><code>978d34d</code></a>
Bump actions/setup-python from 6.2.0 to 6.3.0</li>
<li><a
href="https://github.com/tkem/cachetools/commit/d5c7eea7e52d18fed0ec1b575db1956b1d035782"><code>d5c7eea</code></a>
Reject negative cache item sizes</li>
<li><a
href="https://github.com/tkem/cachetools/commit/578e97648dd312880f8aea172437c6dd424d0028"><code>578e976</code></a>
Update build environment.</li>
<li><a
href="https://github.com/tkem/cachetools/commit/e164b7020e4211b57d20fe2b252d931af6244ad4"><code>e164b70</code></a>
Bump codecov/codecov-action from 6.0.0 to 7.0.0</li>
<li>Additional commits viewable in <a
href="https://github.com/tkem/cachetools/compare/v7.1.4...v7.1.6">compare
view</a></li>
</ul>
</details>
<br />

Updates `certifi` from 2026.6.17 to 2026.7.22
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/certifi/python-certifi/commit/f4bc676bc101fe2235846e37044e8c693d6cbaf4"><code>f4bc676</code></a>
2026.07.22 (<a
href="https://redirect.github.com/certifi/python-certifi/issues/428">#428</a>)</li>
<li><a
href="https://github.com/certifi/python-certifi/commit/4c91f9c5f9b4676d40d2930025ba04d80dd536f6"><code>4c91f9c</code></a>
Bump actions/setup-python from 6.3.0 to 7.0.0 (<a
href="https://redirect.github.com/certifi/python-certifi/issues/427">#427</a>)</li>
<li><a
href="https://github.com/certifi/python-certifi/commit/01a66c5cf32eadb8f03a0504c24cb44f6d581248"><code>01a66c5</code></a>
Bump actions/checkout from 7.0.0 to 7.0.1 (<a
href="https://redirect.github.com/certifi/python-certifi/issues/426">#426</a>)</li>
<li><a
href="https://github.com/certifi/python-certifi/commit/eb355f41cb71f71012ecf1a4d27a57d0ee2b1337"><code>eb355f4</code></a>
Bump pypa/gh-action-pypi-publish from 1.14.0 to 1.14.1 (<a
href="https://redirect.github.com/certifi/python-certifi/issues/425">#425</a>)</li>
<li><a
href="https://github.com/certifi/python-certifi/commit/474e6fc996d55b91632248da0bade702504e62dc"><code>474e6fc</code></a>
Include tests in the source distribution (<a
href="https://redirect.github.com/certifi/python-certifi/issues/424">#424</a>)</li>
<li><a
href="https://github.com/certifi/python-certifi/commit/a31ef39bb5906af7dc9729890f7e4e04e75afdae"><code>a31ef39</code></a>
Bump actions/setup-python from 6.2.0 to 6.3.0 (<a
href="https://redirect.github.com/certifi/python-certifi/issues/420">#420</a>)</li>
<li><a
href="https://github.com/certifi/python-certifi/commit/98eb2c76a9c7a8519912023dca00f762bbcd59af"><code>98eb2c7</code></a>
Bump actions/checkout from 6.0.3 to 7.0.0 (<a
href="https://redirect.github.com/certifi/python-certifi/issues/419">#419</a>)</li>
<li>See full diff in <a
href="https://github.com/certifi/python-certifi/compare/2026.06.17...2026.07.22">compare
view</a></li>
</ul>
</details>
<br />

Updates `cloud-sql-python-connector` from 1.20.4 to 1.21.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/releases">cloud-sql-python-connector's
releases</a>.</em></p>
<blockquote>
<h2>v1.21.0</h2>
<h2><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.20.4...v1.21.0">1.21.0</a>
(2026-07-23)</h2>
<h3>Features</h3>
<ul>
<li>Add PSC DNS and Global Write Endpoint support to Python Connector
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1424">#1424</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/b34e9c643017823e579e20eb47222f5ff510bf5e">b34e9c6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>update python dependencies (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1443">#1443</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2adc5157bda4b0bdea75687c2e511fa03be0bc3e">2adc515</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/blob/main/CHANGELOG.md">cloud-sql-python-connector's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.20.4...v1.21.0">1.21.0</a>
(2026-07-23)</h2>
<h3>Features</h3>
<ul>
<li>Add PSC DNS and Global Write Endpoint support to Python Connector
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1424">#1424</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/b34e9c643017823e579e20eb47222f5ff510bf5e">b34e9c6</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>update python dependencies (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1443">#1443</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2adc5157bda4b0bdea75687c2e511fa03be0bc3e">2adc515</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/bcc1cbf7cd7f4f94ebcf9aed821d9816b55ea3c9"><code>bcc1cbf</code></a>
chore(main): release 1.21.0 (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1444">#1444</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/b34e9c643017823e579e20eb47222f5ff510bf5e"><code>b34e9c6</code></a>
feat: Add PSC DNS and Global Write Endpoint support to Python Connector
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1424">#1424</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/53b3bcad84d238b74e9a46501d781a10818e0bd3"><code>53b3bca</code></a>
chore: add venv helper and grpc dependencies (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1445">#1445</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2adc5157bda4b0bdea75687c2e511fa03be0bc3e"><code>2adc515</code></a>
fix: update python dependencies (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1443">#1443</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/4baeb6f1d048c41828467ddca57930c7ae72c623"><code>4baeb6f</code></a>
refactor: replace aiofiles with asyncio.to_thread (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1437">#1437</a>)</li>
<li>See full diff in <a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.20.4...v1.21.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `fastapi` from 0.139.2 to 0.140.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/fastapi/fastapi/releases">fastapi's
releases</a>.</em></p>
<blockquote>
<h2>0.140.2</h2>
<h3>Refactors</h3>
<ul>
<li>⚡️ Stop retaining flat dependency trees. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16065">#16065</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>👷 Add new memory benchmark. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16064">#16064</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h2>0.140.1</h2>
<h3>Refactors</h3>
<ul>
<li>♻️ Update the lru_cache limit for dependencies to account for large
apps. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16062">#16062</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h2>0.140.0</h2>
<h3>Refactors</h3>
<ul>
<li>⚡️ Reduce memory usage in dependencies. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16049">#16049</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Docs</h3>
<ul>
<li>📝 Fix links in docs. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/15967">#15967</a>
by <a
href="https://github.com/YuriiMotov"><code>@​YuriiMotov</code></a>.</li>
<li>📝 Add Library Skills documentation. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16041">#16041</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>📝 Update docs to use uv projects by default. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16032">#16032</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>📝 Restructure FastAPI People and related pages. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16015">#16015</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
<h3>Internal</h3>
<ul>
<li>👷 Add CI memory benchmark. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16046">#16046</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>👥 Update FastAPI People - Sponsors. PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16027">#16027</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
<li>🔥 Remove now-obsolete scripts to generate data for FastAPI People.
PR <a
href="https://redirect.github.com/fastapi/fastapi/pull/16016">#16016</a>
by <a
href="https://github.com/tiangolo"><code>@​tiangolo</code></a>.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/fastapi/fastapi/commit/051dfeddcc1531037e23f928197a553c8732090c"><code>051dfed</code></a>
🔖 Release version 0.140.2 (<a
href="https://redirect.github.com/fastapi/fastapi/issues/16066">#16066</a>)</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/e9980492f2d35ea309bc2dea54a2836aae0a4dc4"><code>e998049</code></a>
📝 Update release notes</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/8069eadf5e12235bcbbdd2d3bafe5226c585e997"><code>8069ead</code></a>
⚡️ Stop retaining flat dependency trees (<a
href="https://redirect.github.com/fastapi/fastapi/issues/16065">#16065</a>)</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/2b4349d6c24326665423ce6819b402f0267cb9b9"><code>2b4349d</code></a>
📝 Update release notes</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/2f34b90742e4afd2df61e30a721ef01a41a59cfb"><code>2f34b90</code></a>
👷 Add new memory benchmark (<a
href="https://redirect.github.com/fastapi/fastapi/issues/16064">#16064</a>)</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/3e310c90faa5e580ac9b21abd4e9d027f2e28d0c"><code>3e310c9</code></a>
🔖 Release version 0.140.1 (<a
href="https://redirect.github.com/fastapi/fastapi/issues/16063">#16063</a>)</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/43eafc6a282c28cf44e53829d65d441f05deefd8"><code>43eafc6</code></a>
📝 Update release notes</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/65ef53ae6ac110ae7d56f81a7723e58ab319f339"><code>65ef53a</code></a>
♻️ Update the lru_cache limit for dependencies to account for large apps
(<a
href="https://redirect.github.com/fastapi/fastapi/issues/16">#16</a>...</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/255b912928904e3ba5980425a54d6837c8bd1a1c"><code>255b912</code></a>
🔖 Release version 0.140.0 (<a
href="https://redirect.github.com/fastapi/fastapi/issues/16050">#16050</a>)</li>
<li><a
href="https://github.com/fastapi/fastapi/commit/892eacd27dcdcfe6c5ea114543ff473cbbfd7c6f"><code>892eacd</code></a>
📝 Update release notes</li>
<li>Additional commits viewable in <a
href="https://github.com/fastapi/fastapi/compare/0.139.2...0.140.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-core` from 2.32.0 to 2.33.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-cloud-python/releases">google-api-core's
releases</a>.</em></p>
<blockquote>
<h2>google-api-core: v2.33.0</h2>
<h2><a
href="https://github.com/googleapis/google-cloud-python/compare/google-api-core-v2.32.0...google-api-core-v2.33.0">2.33.0</a>
(2026-07-22)</h2>
<h3>Features</h3>
<ul>
<li><strong>api_core:</strong> add request-id auto-population logic to
gapic_v1 public helpers (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17738">#17738</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/68e131341bd5d20ee50d7be3ed0410af4c12a46d">68e1313</a>)</li>
<li><strong>api-core:</strong> add get_universe_domain helper to
universe.py (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17799">#17799</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/d461da7bde04f2a698469f413116873633aa1f12">d461da7</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>api-core:</strong> prevent overwriting explicit empty
strings for optional request_id (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17798">#17798</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/07f7503437f495dbce19b4f346ea17efcd738a65">07f7503</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/6702c7ad7b9ecbe53940fc7ce281059a200d7cda"><code>6702c7a</code></a>
chore: release main (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17809">#17809</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/6ab2fe1cff28adbaa328fc05c9201061fed8a400"><code>6ab2fe1</code></a>
chore(main): release google-cloud-productregistry 0.1.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17806">#17806</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/cc109caf93ddc46b748b7bcebfb952f43fe9b4b1"><code>cc109ca</code></a>
chore(main): release google-auth 2.56.2 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17814">#17814</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/9668675a54ff7644a7524889a5f4af6a4e018a3a"><code>9668675</code></a>
chore: update librarian to v0.28.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17811">#17811</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/d4b76faafc7c0a09cda428d39310b0a933e06e73"><code>d4b76fa</code></a>
chore(sqlalchemy-bigquery): restore complete coverage (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17770">#17770</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/df0541abf6aae710fc3e6644a5d8f3f706d29c5a"><code>df0541a</code></a>
fix(gapic): mock os.path.exists in mTLS tests to support newer google
auth (#...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/1a10e236b26b0e23e5c7d1318ae86c9a1e05ca37"><code>1a10e23</code></a>
chore(main): release google-maps-isochrones 0.1.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17804">#17804</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/2a2dc8323278deec735057255f3ade70c8eca039"><code>2a2dc83</code></a>
test(bigquery): add debug info to socket leak test (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17802">#17802</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/b2d3fb9521196fd4d9f864f608d791173e0425af"><code>b2d3fb9</code></a>
chore(handwritten): centralize mypy configuration and update handwritten
pack...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/2a7d346d54dddf73c1185245c0f89a119bb333ec"><code>2a7d346</code></a>
tests: remove protobuf cpp from tests which is no longer used as of
Protobuf ...</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/google-cloud-python/compare/google-api-core-v2.32.0...google-api-core-v2.33.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-auth` from 2.56.0 to 2.56.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-cloud-python/releases">google-auth's
releases</a>.</em></p>
<blockquote>
<h2>google-auth: v2.56.2</h2>
<h2><a
href="https://github.com/googleapis/google-cloud-python/compare/google-auth-v2.56.1...google-auth-v2.56.2">2.56.2</a>
(2026-07-21)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>auth:</strong> centralize cert discovery logic and steps (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17696">#17696</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/edc0423e57dd06bef3a93802642a074ab8b7bc5d">edc0423</a>)</li>
<li><strong>auth:</strong> exit early when agent cert config is outside
well-known directory (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17762">#17762</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/61e795a8299afec863487776c8a679adbb2911ab">61e795a</a>)</li>
<li><strong>transport:</strong> propagate mTLS adapter to auth session
and fix connection leaks (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17689">#17689</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/8289d328f9a1eb2abb766644e4f6748198679c80">8289d32</a>)</li>
<li>update _SERVICE_ACCOUNT_EMAIL_PATTERN to require
.gserviceaccount.com suffix (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17748">#17748</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/b60bb04a73eb35b15320c54bc3493132e6ba5706">b60bb04</a>)</li>
</ul>
<h2>google-auth: v2.56.1</h2>
<h2><a
href="https://github.com/googleapis/google-cloud-python/compare/google-auth-v2.56.0...google-auth-v2.56.1">2.56.1</a>
(2026-07-17)</h2>
<h3>Bug Fixes</h3>
<ul>
<li>disable RAB lookup for Domain-Wide Delegation (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17763">#17763</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/00eb1284fb6081cd37b747d09366568490a6d9ad">00eb128</a>),
closes <a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17703">#17703</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/cc109caf93ddc46b748b7bcebfb952f43fe9b4b1"><code>cc109ca</code></a>
chore(main): release google-auth 2.56.2 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17814">#17814</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/d4b76faafc7c0a09cda428d39310b0a933e06e73"><code>d4b76fa</code></a>
chore(sqlalchemy-bigquery): restore complete coverage (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17770">#17770</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/df0541abf6aae710fc3e6644a5d8f3f706d29c5a"><code>df0541a</code></a>
fix(gapic): mock os.path.exists in mTLS tests to support newer google
auth (#...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/1a10e236b26b0e23e5c7d1318ae86c9a1e05ca37"><code>1a10e23</code></a>
chore(main): release google-maps-isochrones 0.1.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17804">#17804</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/2a2dc8323278deec735057255f3ade70c8eca039"><code>2a2dc83</code></a>
test(bigquery): add debug info to socket leak test (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17802">#17802</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/b2d3fb9521196fd4d9f864f608d791173e0425af"><code>b2d3fb9</code></a>
chore(handwritten): centralize mypy configuration and update handwritten
pack...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/2a7d346d54dddf73c1185245c0f89a119bb333ec"><code>2a7d346</code></a>
tests: remove protobuf cpp from tests which is no longer used as of
Protobuf ...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/fb5aada9ed82184025df5994e4f3c5467fd88417"><code>fb5aada</code></a>
chore(main): release google-cloud-commerceproducer 0.1.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17805">#17805</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/b60bb04a73eb35b15320c54bc3493132e6ba5706"><code>b60bb04</code></a>
fix: update _SERVICE_ACCOUNT_EMAIL_PATTERN to require
.gserviceaccount.com ...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/ed25698a89a92f8ae67167c811d02dd9e5815a7e"><code>ed25698</code></a>
tests(sqlalchemy-bigquery): resolve ST function type binding bug (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17769">#17769</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/google-cloud-python/compare/google-auth-v2.56.0...google-auth-v2.56.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `greenlet` from 3.5.3 to 3.5.4
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's
changelog</a>.</em></p>
<blockquote>
<h1>3.5.4 (2026-07-22)</h1>
<ul>
<li>
<p>Fix a crash (segfault) on free-threaded builds of Python 3.14 and
later when the garbage collector runs while a greenlet that was
started from a non-empty C-stack-reference state is active.
See <code>issue 515
&lt;https://github.com/python-greenlet/greenlet/issues/515&gt;</code>_.
Thanks to ddorian and Kumar Aditya.</p>
</li>
<li>
<p>Fix a potential use-after-free on free-threaded builds of Python 3.14
and later when the garbage collector runs while a greenlet is
suspended holding a <code>_PyCStackRef</code> (for example, mid
attribute
resolution). See
<code>issue 515
&lt;https://github.com/python-greenlet/greenlet/issues/515&gt;</code>_.
Thanks to ddorian and Kumar Aditya.</p>
</li>
<li>
<p>Fix a deadlock on free-threaded builds when a greenlet switch
happened
while a <code>PyCriticalSection</code> was held -- for example inside
asyncio's
<code>Task.__step</code>, which holds one on the running task for the
duration of
the step. See <code>PR 519
&lt;https://github.com/python-greenlet/greenlet/pull/519/&gt;</code>.
Thanks to ddorian and Kumar Aditya.</p>
</li>
</ul>
<p>.. note::
Binary 3.15 wheels are now built with Python 3.15b4. These may not
be compatible with earlier or later versions of 3.15. Binary
3.15 wheels of greenlet from previous releases (e.g., 3.5.3)
may not be compatible with Python 3.15b4.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/384be8821a934fbb835e369dda2b9b72107e80be"><code>384be88</code></a>
Preparing release 3.5.4</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/bbdf57b8cccc572639103005bc7dee41d1c309a2"><code>bbdf57b</code></a>
Add note to CHANGES about versions of 3.15 binary wheels may/not be
compatibl...</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/759902381a85e2ebca2102fab50ffb99b2227a2b"><code>7599023</code></a>
Merge pull request <a
href="https://redirect.github.com/python-greenlet/greenlet/issues/517">#517</a>
from ddorian/issue515-c-stack-refs</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/73a0a1aadf8d45db71754954d588d433fa826a2a"><code>73a0a1a</code></a>
Fix the suspended C-stack-ref GC test to catch its regression</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/1ff35f431f768e854db323ae14274044a06d9d12"><code>1ff35f4</code></a>
Merge branch 'master' into issue515-c-stack-refs</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/847fb824f6c0590d87963c38c4b2f452a0980b37"><code>847fb82</code></a>
Merge pull request <a
href="https://redirect.github.com/python-greenlet/greenlet/issues/520">#520</a>
from dynapx/fix-test-extension-npd</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/0b471ba66bed12fcf7bef969f26705a30a29a5b4"><code>0b471ba</code></a>
Merge pull request <a
href="https://redirect.github.com/python-greenlet/greenlet/issues/519">#519</a>
from ddorian/freethread-switch-critical-section</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/d55914df27b30af452e63eb2be41fc9b3ec2c982"><code>d55914d</code></a>
Simplify the CHANGES.rst entry</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/78932dc67b6571a920751339cfd88056144e8116"><code>78932dc</code></a>
Change notes are for end users, they don't need to go into technical
detail</li>
<li><a
href="https://github.com/python-greenlet/greenlet/commit/39bf70c2cb8c8996ce26bc20e4161fd94c05d380"><code>39bf70c</code></a>
Hold the C-stack ref snapshot in a std::vector&lt;OwnedObject&gt;</li>
<li>Additional commits viewable in <a
href="https://github.com/python-greenlet/greenlet/compare/3.5.3...3.5.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `phonenumbers` from 9.0.34 to 9.0.35
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/daviddrysdale/python-phonenumbers/commit/314e40fdaacc2a6aba3cf4080719a3d518ae438d"><code>314e40f</code></a>
Prep for 9.0.35 release</li>
<li><a
href="https://github.com/daviddrysdale/python-phonenumbers/commit/ba1f5b1ebe3aeec12a2f74d4ebc4c0d77dc1a084"><code>ba1f5b1</code></a>
Generated files for metadata</li>
<li><a
href="https://github.com/daviddrysdale/python-phonenumbers/commit/6245715534a4fd2620463a617508d72bba8f20aa"><code>6245715</code></a>
Merge metadata changes from upstream 9.0.35</li>
<li>See full diff in <a
href="https://github.com/daviddrysdale/python-phonenumbers/compare/v9.0.34...v9.0.35">compare
view</a></li>
</ul>
</details>
<br />

Updates `proto-plus` from 1.28.1 to 1.28.2
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-cloud-python/releases">proto-plus's
releases</a>.</em></p>
<blockquote>
<h2>proto-plus: v1.28.2</h2>
<h2><a
href="https://github.com/googleapis/google-cloud-python/compare/proto-plus-v1.28.1...proto-plus-v1.28.2">1.28.2</a>
(2026-07-22)</h2>
<h3>Bug Fixes</h3>
<ul>
<li><strong>proto-plus:</strong> make Marshal thread-safe and handle
race conditions (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17774">#17774</a>)
(<a
href="https://github.com/googleapis/google-cloud-python/commit/0719f1ec1d4146dbfc96d24c95b7ccafd31ab447">0719f1e</a>),
closes <a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/15100">#15100</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/6702c7ad7b9ecbe53940fc7ce281059a200d7cda"><code>6702c7a</code></a>
chore: release main (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17809">#17809</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/6ab2fe1cff28adbaa328fc05c9201061fed8a400"><code>6ab2fe1</code></a>
chore(main): release google-cloud-productregistry 0.1.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17806">#17806</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/cc109caf93ddc46b748b7bcebfb952f43fe9b4b1"><code>cc109ca</code></a>
chore(main): release google-auth 2.56.2 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17814">#17814</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/9668675a54ff7644a7524889a5f4af6a4e018a3a"><code>9668675</code></a>
chore: update librarian to v0.28.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17811">#17811</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/d4b76faafc7c0a09cda428d39310b0a933e06e73"><code>d4b76fa</code></a>
chore(sqlalchemy-bigquery): restore complete coverage (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17770">#17770</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/df0541abf6aae710fc3e6644a5d8f3f706d29c5a"><code>df0541a</code></a>
fix(gapic): mock os.path.exists in mTLS tests to support newer google
auth (#...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/1a10e236b26b0e23e5c7d1318ae86c9a1e05ca37"><code>1a10e23</code></a>
chore(main): release google-maps-isochrones 0.1.0 (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17804">#17804</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/2a2dc8323278deec735057255f3ade70c8eca039"><code>2a2dc83</code></a>
test(bigquery): add debug info to socket leak test (<a
href="https://redirect.github.com/googleapis/google-cloud-python/issues/17802">#17802</a>)</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/b2d3fb9521196fd4d9f864f608d791173e0425af"><code>b2d3fb9</code></a>
chore(handwritten): centralize mypy configuration and update handwritten
pack...</li>
<li><a
href="https://github.com/googleapis/google-cloud-python/commit/2a7d346d54dddf73c1185245c0f89a119bb333ec"><code>2a7d346</code></a>
tests: remove protobuf cpp from tests which is no longer used as of
Protobuf ...</li>
<li>Additional commits viewable in <a
href="https://github.com/googleapis/google-cloud-python/compare/proto-plus-v1.28.1...proto-plus-v1.28.2">compare
view</a></li>
</ul>
</details>
<br />

Updates `pytz` from 2026.2 to 2026.3.post1
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/stub42/pytz/commit/661bca921e29dc3eedd4430bac70816c9154c05e"><code>661bca9</code></a>
Bump version numbers to 2026.3.post1 for python2 fix</li>
<li><a
href="https://github.com/stub42/pytz/commit/1e31a162477bfd338df4651cbb55d35a86a15cd1"><code>1e31a16</code></a>
Log python version running tests, force python2</li>
<li><a
href="https://github.com/stub42/pytz/commit/b3ca7c3fc264252e7f8162229f9d0dc4410037ee"><code>b3ca7c3</code></a>
Unix line endings</li>
<li><a
href="https://github.com/stub42/pytz/commit/b55039a6ad038432bfc8e718f1852f54599bfa30"><code>b55039a</code></a>
Replace non-ASCII character in comment to fix build with Python 2</li>
<li><a
href="https://github.com/stub42/pytz/commit/5420ee2c14c95abd5258c0e43381ac9430647ab8"><code>5420ee2</code></a>
Replace non-ASCII character in comment</li>
<li><a
href="https://github.com/stub42/pytz/commit/2c139e800b5353eb6bb9649ee51fc177b51c4e9e"><code>2c139e8</code></a>
Merge branch 'fix/localize-overflow-at-datetime-extremes' of <a
href="https://github.c">https://github.c</a>...</li>
<li><a
href="https://github.com/stub42/pytz/commit/c843864ba959a0def449dfe5c4f1547308ab8eb1"><code>c843864</code></a>
Run zdump tests quietly</li>
<li><a
href="https://github.com/stub42/pytz/commit/518500c68a9ed1f6cda32101004c38b4cc1d6fa6"><code>518500c</code></a>
Reduce noise when collecting zdump info dumps</li>
<li><a
href="https://github.com/stub42/pytz/commit/081f935fbc519305e147480ecd3410052f07816c"><code>081f935</code></a>
Merge branch 'kytta-fix-dst' into 2026c</li>
<li><a
href="https://github.com/stub42/pytz/commit/8c9d69b125dabe489741e1eb24ba14fcf4a7e7c9"><code>8c9d69b</code></a>
Merge branch 'master' into 2026c</li>
<li>Additional commits viewable in <a
href="https://github.com/stub42/pytz/compare/release_2026.2...release_2026.3.post1">compare
view</a></li>
</ul>
</details>
<br />

Updates `scramp` from 1.4.12 to 1.4.15
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/tlocke/scramp/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `sentry-sdk[fastapi]` from 2.66.0 to 2.66.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-python/releases">sentry-sdk[fastapi]'s
releases</a>.</em></p>
<blockquote>
<h2>2.66.1</h2>
<h3>Bug Fixes 🐛</h3>
<h4>Tracing</h4>
<ul>
<li>Handle exceptions raised within traces_sampler and other callbacks
by <a
href="https://github.com/ericapisani"><code>@​ericapisani</code></a> in
<a
href="https://redirect.github.com/getsentry/sentry-python/pull/6853">#6853</a></li>
</ul>
<h3>Internal Changes 🔧</h3>
<ul>
<li>Fix flaky decorator test by <a
href="https://github.com/sl0thentr0py"><code>@​sl0thentr0py</code></a>
in <a
href="https://redirect.github.com/getsentry/sentry-python/pull/6830">#6830</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md">sentry-sdk[fastapi]'s
changelog</a>.</em></p>
<blockquote>
<h2>2.66.1</h2>
<h3>Bug Fixes 🐛</h3>
<h4>Tracing</h4>
<ul>
<li>Handle exceptions raised within traces_sampler and other callbacks
by <a
href="https://github.com/ericapisani"><code>@​ericapisani</code></a> in
<a
href="https://redirect.github.com/getsentry/sentry-python/pull/6853">#6853</a></li>
</ul>
<h3>Internal Changes 🔧</h3>
<ul>
<li>Fix flaky decorator test by <a
href="https://github.com/sl0thentr0py"><code>@​sl0thentr0py</code></a>
in <a
href="https://redirect.github.com/getsentry/sentry-python/pull/6830">#6830</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/getsentry/sentry-python/commit/653a292f563e02a87e4544969af2f2d55566f1c2"><code>653a292</code></a>
Update CHANGELOG.md</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/e20c2266cb07a6449b35c68ea83784bae9f770e4"><code>e20c226</code></a>
release: 2.66.1</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/4524b65d4118f497e4fc497b9bba25a0359847b4"><code>4524b65</code></a>
fix(tracing): Stop setting <code>NoOpSpan</code> on scope in the
streaming trace lifecyc...</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/2e9f26ee63c861fd2afc0905b2294eb58a0b01d9"><code>2e9f26e</code></a>
ref(tracing): No-op and emit warning in <code>start_transaction</code>
with the streamin...</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/3a50950e632d9923f45a9b6fb18d89e1f27badad"><code>3a50950</code></a>
fix(tracing): handle exceptions raised within traces_sampler and other
callba...</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/b5171b7ade539e70aa074632e6b5435afb1ff5ff"><code>b5171b7</code></a>
ref: Use top-level <code>trace_lifecycle</code> and
<code>ignore_spans</code> options in tests (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/6855">#6855</a>)</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/17e0348cacbe319b512234d85687e7d178feac93"><code>17e0348</code></a>
ref: Use old sampling context format in span streaming (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/6848">#6848</a>)</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/2e0949760f600fafa168d8339179220eebcfdcfb"><code>2e09497</code></a>
test: Add streaming tests to <code>test_http_headers</code> (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/6785">#6785</a>)</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/9996734c9cf733ad92cb3bd1546a64da773eb4ad"><code>9996734</code></a>
feat(tracing): Send <code>sentry.segment.name.source</code> instead of
`sentry.span.sour...</li>
<li><a
href="https://github.com/getsentry/sentry-python/commit/00224f7a99dd593016f43c236f855ec766da0082"><code>00224f7</code></a>
remove span streaming docs in changelog (<a
href="https://redirect.github.com/getsentry/sentry-python/issues/6831">#6831</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/getsentry/sentry-python/compare/2.66.0...2.66.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `pre-commit` from 4.6.0 to 4.6.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pre-commit/pre-commit/releases">pre-commit's
releases</a>.</em></p>
<blockquote>
<h2>pre-commit v4.6.1</h2>
<h3>Fixes</h3>
<ul>
<li>Install <code>language: node</code> hooks via <code>git</code>.
<ul>
<li>Fixes npm 12.x compatibility</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3719">#3719</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3517">#3517</a>
issue by <a href="https://github.com/ojob"><code>@​ojob</code></a>.</li>
</ul>
</li>
<li>Set <code>JULIA_DEPOT_PATH</code> for <code>language: julia</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3711">#3711</a>
PR by <a
href="https://github.com/damonbayer"><code>@​damonbayer</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit-ci/runner-image/issues/335">pre-commit-ci/runner-image#335</a>
issue by <a
href="https://github.com/damonbayer"><code>@​damonbayer</code></a>.</li>
</ul>
</li>
<li>Produce error on mistyped <code>--repo</code> for <code>pre-commit
autoupdate</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3701">#3701</a>
PR by <a href="https://github.com/mxr"><code>@​mxr</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3695">#3695</a>
issue by <a href="https://github.com/mxr"><code>@​mxr</code></a>.</li>
</ul>
</li>
<li>Improve performance of commit existence check in
<code>pre-push</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3726">#3726</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3604">#3604</a>
issue by <a
href="https://github.com/ptarjan"><code>@​ptarjan</code></a>.</li>
</ul>
</li>
<li>Avoid duplicating conflicted filenames during <code>pre-commit run
--all-files</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3727">#3727</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3706">#3706</a>
issue by <a
href="https://github.com/RomanValov"><code>@​RomanValov</code></a>.</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pre-commit/pre-commit/blob/main/CHANGELOG.md">pre-commit's
changelog</a>.</em></p>
<blockquote>
<h1>4.6.1 - 2026-07-21</h1>
<h3>Fixes</h3>
<ul>
<li>Install <code>language: node</code> hooks via <code>git</code>.
<ul>
<li>Fixes npm 12.x compatibility</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3719">#3719</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3517">#3517</a>
issue by <a href="https://github.com/ojob"><code>@​ojob</code></a>.</li>
</ul>
</li>
<li>Set <code>JULIA_DEPOT_PATH</code> for <code>language: julia</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3711">#3711</a>
PR by <a
href="https://github.com/damonbayer"><code>@​damonbayer</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit-ci/runner-image/issues/335">pre-commit-ci/runner-image#335</a>
issue by <a
href="https://github.com/damonbayer"><code>@​damonbayer</code></a>.</li>
</ul>
</li>
<li>Produce error on mistyped <code>--repo</code> for <code>pre-commit
autoupdate</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3701">#3701</a>
PR by <a href="https://github.com/mxr"><code>@​mxr</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3695">#3695</a>
issue by <a href="https://github.com/mxr"><code>@​mxr</code></a>.</li>
</ul>
</li>
<li>Improve performance of commit existence check in
<code>pre-push</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3726">#3726</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3604">#3604</a>
issue by <a
href="https://github.com/ptarjan"><code>@​ptarjan</code></a>.</li>
</ul>
</li>
<li>Avoid duplicating conflicted filenames during <code>pre-commit run
--all-files</code>.
<ul>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3727">#3727</a>
PR by <a
href="https://github.com/asottile"><code>@​asottile</code></a>.</li>
<li><a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3706">#3706</a>
issue by <a
href="https://github.com/RomanValov"><code>@​RomanValov</code></a>.</li>
</ul>
</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/242ce8a25657be59f2770b50de41fe0fd508820d"><code>242ce8a</code></a>
v4.6.1</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/766e550cd31defcb6096a96735c9de299b0eb301"><code>766e550</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3727">#3727</a>
from pre-commit/dedupe</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/1558d06e3d9e5f495cd97ccaefe937b7c44ead70"><code>1558d06</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3726">#3726</a>
from pre-commit/exists-faster</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/8a1c47a2528419e41aadfcf8135926d68f7ffbbb"><code>8a1c47a</code></a>
avoid duplicate files in --all-files during conflict</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/2e01c999b2466ac7e14e1e4a57a04504bd6c1b28"><code>2e01c99</code></a>
faster check of rev existing locally as a commit</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/3613bf27f5500d327de70cd2fa68fa20c8975659"><code>3613bf2</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3701">#3701</a>
from pre-commit/autoupdate-repos</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/1d811d9b0b655fa648001ca479a0b7da9ebd7b8c"><code>1d811d9</code></a>
Return an error for invalid --repo</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/374d354c8be227db651ddd92d9499b87e2ca1ea1"><code>374d354</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3711">#3711</a>
from damonbayer/dmb_JULIA_DEPOT_PATH</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/1e7994fb1fddd31fb1998aa98f84fc43818d9485"><code>1e7994f</code></a>
set JULIA_DEPOT_PATH</li>
<li><a
href="https://github.com/pre-commit/pre-commit/commit/b2b91195d7618d61d8973fefa4e5e084fc160d8d"><code>b2b9119</code></a>
Merge pull request <a
href="https://redirect.github.com/pre-commit/pre-commit/issues/3719">#3719</a>
from pre-commit/npm-unknown-options</li>
<li>Additional commits viewable in <a
href="https://github.com/pre-commit/pre-commit/compare/v4.6.0...v4.6.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-python-client` from 2.184.0 to 2.198.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's
releases</a>.</em></p>
<blockquote>
<h2>v2.198.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.197.0...v2.198.0">2.198.0</a>
(2026-06-23)</h2>
<h3>Features</h3>
<ul>
<li><strong>adexchangebuyer2:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/a6b7a3c1312a0b843c6451f1502268232af1e08d">https://togithub.com/googleapis/google-api-python-client/commit/a6b7a3c1312a0b843c6451f1502268232af1e08d</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>admin:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/39a7f8e64940d318ce50b5431ebca0ca6f044b4e">https://togithub.com/googleapis/google-api-python-client/commit/39a7f8e64940d318ce50b5431ebca0ca6f044b4e</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>agentregistry:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/47cc6885a57ff256a2878b8902f66f4d97e980be">https://togithub.com/googleapis/google-api-python-client/commit/47cc6885a57ff256a2878b8902f66f4d97e980be</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>aiplatform:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/bf9010bd3c1f6825858612032ad8722e53368738">https://togithub.com/googleapis/google-api-python-client/commit/bf9010bd3c1f6825858612032ad8722e53368738</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>alertcenter:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/60ed501536c048d4257f05fb44d01ac90afc45c6">https://togithub.com/googleapis/google-api-python-client/commit/60ed501536c048d4257f05fb44d01ac90afc45c6</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>alloydb:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/07ab81d00d9225efc0d1bfb54d7a2131537013bb">https://togithub.com/googleapis/google-api-python-client/commit/07ab81d00d9225efc0d1bfb54d7a2131537013bb</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>analyticsadmin:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/d13cd0d5ec973a994a6409e4ccdd879ca5cdec24">https://togithub.com/googleapis/google-api-python-client/commit/d13cd0d5ec973a994a6409e4ccdd879ca5cdec24</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>analyticshub:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/29d33229a8aca59cc2105ca57f10c5c34392eedf">https://togithub.com/googleapis/google-api-python-client/commit/29d33229a8aca59cc2105ca57f10c5c34392eedf</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>androidmanagement:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/0b2dcfba95c75409fcebe62b45d481e2b9cee79c">https://togithub.com/googleapis/google-api-python-client/commit/0b2dcfba95c75409fcebe62b45d481e2b9cee79c</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>androidpublisher:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/1dc37cdcddd779ca435abc9593b0bfb4e298770d">https://togithub.com/googleapis/google-api-python-client/commit/1dc37cdcddd779ca435abc9593b0bfb4e298770d</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>artifactregistry:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/001dba95de25008758d1955c7ff5db51e48606a9">https://togithub.com/googleapis/google-api-python-client/commit/001dba95de25008758d1955c7ff5db51e48606a9</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>assuredworkloads:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/2982b1986becfc8cf17768a86146cfac04338f81">https://togithub.com/googleapis/google-api-python-client/commit/2982b1986becfc8cf17768a86146cfac04338f81</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>backupdr:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/0b64d9bb3d591fd521b86b21fdbc37f3dd793f43">https://togithub.com/googleapis/google-api-python-client/commit/0b64d9bb3d591fd521b86b21fdbc37f3dd793f43</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>bigqueryconnection:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/8e6a3e697448de8fd7128240f2615228db24e85c">https://togithub.com/googleapis/google-api-python-client/commit/8e6a3e697448de8fd7128240f2615228db24e85c</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>bigquerydatatransfer:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/012db99dae421f7b21f0e43b1df333b209cf3e15">https://togithub.com/googleapis/google-api-python-client/commit/012db99dae421f7b21f0e43b1df333b209cf3e15</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>bigquery:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/9548dcf1aa1eeaa6524b6d9386178dac69c39096">https://togithub.com/googleapis/google-api-python-client/commit/9548dcf1aa1eeaa6524b6d9386178dac69c39096</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>calendar:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/399252cfd1bed4193f5821e66536d6a3a75f03c8">https://togithub.com/googleapis/google-api-python-client/commit/399252cfd1bed4193f5821e66536d6a3a75f03c8</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>ces:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/2716cb2b0eb0d91686901d5153aa9581d1143bb4">https://togithub.com/googleapis/google-api-python-client/commit/2716cb2b0eb0d91686901d5153aa9581d1143bb4</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>chat:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/0ae828d973d7bb7f3e6f86bd4338b11b9f3c3e8f">https://togithub.com/googleapis/google-api-python-client/commit/0ae828d973d7bb7f3e6f86bd4338b11b9f3c3e8f</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>chromemanagement:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/7afd85a6912a8239b3c72ca765db28487348222a">https://togithub.com/googleapis/google-api-python-client/commit/7afd85a6912a8239b3c72ca765db28487348222a</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>chromewebstore:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/83fbd762d4539251e84ebd6af38a770c73027da7">https://togithub.com/googleapis/google-api-python-client/commit/83fbd762d4539251e84ebd6af38a770c73027da7</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>cloudbuild:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/c38d7967d2acd8762a0b803592d331c11627f750">https://togithub.com/googleapis/google-api-python-client/commit/c38d7967d2acd8762a0b803592d331c11627f750</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>clouddeploy:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/28abab7bb30a59f9487cb693ad90799ccaabdf7d">https://togithub.com/googleapis/google-api-python-client/commit/28abab7bb30a59f9487cb693ad90799ccaabdf7d</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>cloudkms:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/fead0039902e25ada74a65b06d430e8cfa7233f5">https://togithub.com/googleapis/google-api-python-client/commit/fead0039902e25ada74a65b06d430e8cfa7233f5</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ea0e936f22dcf01a92bbd7ad7ede5bbe773e7d3c">ea0e936</a>)</li>
<li><strong>cloudsupport:</strong> Update the api <a
href="https://togithub.co…
Remove the starlette-admin web interface and all supporting
infrastructure. The admin UI was never used in practice.

- Delete the admin/ package (views, auth, config, fields)
- Remove lazy admin initialization and session middleware from
  core/initializers.py and core/factory.py (sessions were only
  used by admin auth)
- Drop starlette-admin and itsdangerous dependencies
- Remove SESSION_SECRET_KEY plumbing from docker-compose,
  App Engine template, CI/CD workflows, .env.example, and tests
- Delete admin-specific unit, integration, and behave tests
- Update README

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…a-NF-Supervisor-Office'-organization-to-lexicon

feat(lexicon): add new organizations to lexicon
Bumps [actions/stale](https://github.com/actions/stale) from 10 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v10...v11)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '11'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
test_get_project_area assumed its "Test Group Foo" fixture would always get database id 1, which only held because nothing else in the suite created a Group row first. Any earlier-running test that inserts a Group (e.g. a data-migration test) shifts the sequence and breaks this test with an unrelated 404.

Use the fixture's actual group.id instead of the literal 1.
pyproject.toml's explicit setuptools packages list omitted data_migrations, so the installed `oco` CLI couldn't import it at all -- `oco data-migrations status/run` failed with ModuleNotFoundError for every migration, not just new ones. Running via `uv run pytest`/`python -c` masked this because pytest prepends the repo root to sys.path; the installed console-script entry point does not.
The upcoming ogc_* view filter excludes non-public records, and nine currently-passing tests in test_ogc.py assert that rows backed by the shared location/water_well_thing/group fixtures ARE present in ogc_* responses. Their "draft" default was an arbitrary safe value, not a deliberate test input -- confirmed by grepping the suite for anything that depends on it being specifically "draft".

Flips the three fixtures plus one inline Group(...)construction in test_ogc.py that bypassed the fixture.
Every ogc_* view/materialized view selected release_status but never filtered on it, so the unauthenticated /ogcapi endpoints have been serving private and draft records alongside public ones (e.g. water_wells: 1,145 private + 140 draft rows next to 8,678 public).

Adds "AND release_status = 'public'" to all 21 existing ogc_* relations and introduces ogc_locations (previously the locations collection pointed straight at the raw location table, which has no filter at all). ogc_actively_monitored_wells gets no predicate of its own -- it already inherits public-only rows transitively through its join to ogc_water_well_summary; adding a redundant filter on status_history.release_status would repeat a mistake already made and reverted once (see w1x2y3z4a5b6), since that column is never populated by the transfer scripts.

Fully reversible: downgrade() rebuilds the same relations with the byte-identical unfiltered SQL that was in production before this migration (ogc_locations is the exception, since it didn't exist pre-migration -- downgrade drops it rather than recreating it unfiltered).

Repoints core/pygeoapi-config.yml's locations provider at the new view in the same commit, since shipping the view without the config change (or vice versa) leaves the collection either unfiltered or broken.

Layer visibility (which collections are published)is unchanged. That's separate, out-of-scope work.
ogc_project_areas is now filtered to public records, but all 56 current project_area-bearing group rows are release_status=draft (confirmed in docs/ogc-layer-audit.md), which would make the layer return zero rows until someone flips them.

Uses the data_migrations framework (not Alembic, which is schema-only in this repo) so the change is tracked, skip-if-applied, and gated on this ticket's schema revision having landed first. Runs independently via `oco data-migrations run 20260714_0001_publish_project_areas` -- deliberately not swept in via run-all, which could also apply other unrelated pending migrations. No downgrade: this framework is forward-only, and a blanket revert couldn't tell rows this migration published apart from ones published independently afterward -- undoing it later means writing a new, deliberate migration instead.

This is a genuine publication decision, not a mechanical schema change -- confirm the 56 rows are actually appropriate for public release before merging.
jirhiker and others added 19 commits August 22, 2026 10:32
…r-metadata

chore(ogc): rich layer and field-level metadata
…3.19 in the gha-minor-and-patch group (#879)

Bumps the gha-minor-and-patch group with 1 update:
[dagster-io/dagster-cloud-action](https://github.com/dagster-io/dagster-cloud-action).

Updates `dagster-io/dagster-cloud-action` from 1.13.18 to 1.13.19
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/dagster-io/dagster-cloud-action/commit/a5c409dd1635efc77ca2a3925288864f1b35f73e"><code>a5c409d</code></a>
Rebuild for 1.13.19</li>
<li>See full diff in <a
href="https://github.com/dagster-io/dagster-cloud-action/compare/v1.13.18...v1.13.19">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=dagster-io/dagster-cloud-action&package-manager=github_actions&previous-version=1.13.18&new-version=1.13.19)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps the uv-non-major group with 10 updates:

| Package | From | To |
| --- | --- | --- |
| [charset-normalizer](https://github.com/jawah/charset_normalizer) |
`3.5.0` | `3.5.1` |
|
[cloud-sql-python-connector](https://github.com/GoogleCloudPlatform/cloud-sql-python-connector)
| `1.21.0` | `1.22.0` |
| [gunicorn](https://github.com/benoitc/gunicorn) | `26.0.0` | `26.1.0`
|
| [idna](https://github.com/kjd/idna) | `3.18` | `3.19` |
| [pygments](https://github.com/pygments/pygments) | `2.20.0` | `2.21.0`
|
| [uvicorn](https://github.com/Kludex/uvicorn) | `0.52.3` | `0.52.4` |
| [python-dotenv](https://github.com/theskumar/python-dotenv) | `1.2.2`
| `1.2.3` |
|
[google-api-python-client](https://github.com/googleapis/google-api-python-client)
| `2.198.0` | `2.199.0` |
| [dagster](https://github.com/dagster-io/dagster) | `1.13.18` |
`1.13.19` |
| [dagster-cloud](https://github.com/dagster-io/dagster-cloud) |
`1.13.18` | `1.13.19` |

Updates `charset-normalizer` from 3.5.0 to 3.5.1
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/jawah/charset_normalizer/releases">charset-normalizer's
releases</a>.</em></p>
<blockquote>
<h2>Version 3.5.1</h2>
<h2><a
href="https://github.com/Ousret/charset_normalizer/compare/3.5.0...3.5.1">3.5.1</a>
(2026-08-15)</h2>
<h3>Changed</h3>
<ul>
<li>Raised upper bound of setuptools to v84 (<a
href="https://redirect.github.com/jawah/charset_normalizer/issues/794">#794</a>)</li>
<li>Cache performance access optimization for our CharInfo struct
(prebuilt only).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>No longer decoding large content when the noise detector output give
a high entropy.
Only impacted large content input &gt;1M bytes.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/jawah/charset_normalizer/blob/master/CHANGELOG.md">charset-normalizer's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/Ousret/charset_normalizer/compare/3.5.0...3.5.1">3.5.1</a>
(2026-08-15)</h2>
<h3>Changed</h3>
<ul>
<li>Raised upper bound of setuptools to v84 (<a
href="https://redirect.github.com/jawah/charset_normalizer/issues/794">#794</a>)</li>
<li>Cache performance access optimization for our CharInfo struct
(prebuilt only).</li>
</ul>
<h3>Fixed</h3>
<ul>
<li>No longer decoding large content when the noise detector output give
a high entropy.
Only impacted large content input &gt;1M bytes.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/e239bdc5cc1eb1f0db08d4046ad531f805dbea71"><code>e239bdc</code></a>
Merge pull request <a
href="https://redirect.github.com/jawah/charset_normalizer/issues/795">#795</a>
from jawah/release-3.5.1</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/648ad776db64a00aa7efd70a94656ac43784abb3"><code>648ad77</code></a>
docs: update faq</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/fab27492c39baa61aca12826022e266781108570"><code>fab2749</code></a>
docs: write changelog for 3.5.1</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/7d32774e75d16cccd3d22c758a77fca135952787"><code>7d32774</code></a>
chore: bump version to 3.5.1</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/9a69f609f254ba4bfe9d0cbf375728e43360cdf2"><code>9a69f60</code></a>
docs: update data/info</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/5dcc6dd81a8a0a4bd525f8d6f508da8285caf402"><code>5dcc6dd</code></a>
perf: charinfo cache access optimization in cython</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/ea3b4479270762be1228562c590e5a212727f208"><code>ea3b447</code></a>
fix: do not validate-decode large payload when md says it's noise</li>
<li><a
href="https://github.com/jawah/charset_normalizer/commit/a05917f87b5f71d6022d8abe2b0af239f65c1111"><code>a05917f</code></a>
chore: allow setuptools 84 builds (<a
href="https://redirect.github.com/jawah/charset_normalizer/issues/794">#794</a>)</li>
<li>See full diff in <a
href="https://github.com/jawah/charset_normalizer/compare/3.5.0...3.5.1">compare
view</a></li>
</ul>
</details>
<br />

Updates `cloud-sql-python-connector` from 1.21.0 to 1.22.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/releases">cloud-sql-python-connector's
releases</a>.</em></p>
<blockquote>
<h2>v1.22.0</h2>
<h2><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.21.0...v1.22.0">1.22.0</a>
(2026-08-18)</h2>
<h3>Features</h3>
<ul>
<li>Add PSC DNS and Global Write Endpoint support to Python Connector
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1446">#1446</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/62640f3c4f1e5cccf9c1c4622d4025804e92d02f">62640f3</a>)</li>
<li>add support for psycopg (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1452">#1452</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/ba58f8ff573e5559dd7d9b4be7ffb2db6d5db6da">ba58f8f</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>psycopg:</strong> add platform guard for platforms without
AF_UNIX support (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1466">#1466</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2dfee663f8e5bbf0392ea1cf9940ec5e8b533448">2dfee66</a>)</li>
<li>update deps to the latest (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1456">#1456</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/a1bdfc7b3ae16af2c99c6faa1b12757d55d6ad72">a1bdfc7</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update pg8000 link to new repository location (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1368">#1368</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2b20167d683a1bc827f37bbb421cf5d6fa2e0de0">2b20167</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/blob/main/CHANGELOG.md">cloud-sql-python-connector's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.21.0...v1.22.0">1.22.0</a>
(2026-08-18)</h2>
<h3>Features</h3>
<ul>
<li>Add PSC DNS and Global Write Endpoint support to Python Connector
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1446">#1446</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/62640f3c4f1e5cccf9c1c4622d4025804e92d02f">62640f3</a>)</li>
<li>add support for psycopg (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1452">#1452</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/ba58f8ff573e5559dd7d9b4be7ffb2db6d5db6da">ba58f8f</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><strong>psycopg:</strong> add platform guard for platforms without
AF_UNIX support (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1466">#1466</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2dfee663f8e5bbf0392ea1cf9940ec5e8b533448">2dfee66</a>)</li>
<li>update deps to the latest (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1456">#1456</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/a1bdfc7b3ae16af2c99c6faa1b12757d55d6ad72">a1bdfc7</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>update pg8000 link to new repository location (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1368">#1368</a>)
(<a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2b20167d683a1bc827f37bbb421cf5d6fa2e0de0">2b20167</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/257407a9d7538ba4cebf47cf14a64f741af6365e"><code>257407a</code></a>
chore(main): release 1.22.0 (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1455">#1455</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/847b34f0d6ac07cda5b35bac1a6030127747d6d4"><code>847b34f</code></a>
chore(deps): update dependency idna to v3.19 (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1468">#1468</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/31c415e860354446da88c918b818dda56fbdfcfa"><code>31c415e</code></a>
ci: skip schedule reporter on forks (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1469">#1469</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2dfee663f8e5bbf0392ea1cf9940ec5e8b533448"><code>2dfee66</code></a>
fix(psycopg): add platform guard for platforms without AF_UNIX support
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1466">#1466</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/2b20167d683a1bc827f37bbb421cf5d6fa2e0de0"><code>2b20167</code></a>
docs: update pg8000 link to new repository location (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1368">#1368</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/ba58f8ff573e5559dd7d9b4be7ffb2db6d5db6da"><code>ba58f8f</code></a>
feat: add support for psycopg (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1452">#1452</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/5aa23dcaff5c1907e655e771f4ad487f5cd9ea62"><code>5aa23dc</code></a>
test: improve unit test coverage and fix deprecation warnings (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1453">#1453</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/a1bdfc7b3ae16af2c99c6faa1b12757d55d6ad72"><code>a1bdfc7</code></a>
fix: update deps to the latest (<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1456">#1456</a>)</li>
<li><a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/commit/62640f3c4f1e5cccf9c1c4622d4025804e92d02f"><code>62640f3</code></a>
feat: Add PSC DNS and Global Write Endpoint support to Python Connector
(<a
href="https://redirect.github.com/GoogleCloudPlatform/cloud-sql-python-connector/issues/1446">#1446</a>)</li>
<li>See full diff in <a
href="https://github.com/GoogleCloudPlatform/cloud-sql-python-connector/compare/v1.21.0...v1.22.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `gunicorn` from 26.0.0 to 26.1.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/benoitc/gunicorn/releases">gunicorn's
releases</a>.</em></p>
<blockquote>
<h2>gunicorn 26.1.0</h2>
<h3>New Features</h3>
<ul>
<li><strong>Glob patterns in <code>reload_extra_files</code></strong>:
entries containing <code>*</code>, <code>?</code> or <code>[</code>
are treated as patterns, so <code>ui/*/config.json</code> watches every
view's config
without listing them one by one. Patterns are re-expanded on every
reload
check rather than once at startup, so a file created later starts being
watched without restarting gunicorn, and <code>**</code> recurses. A
pattern matching
nothing warns instead of failing, since with live expansion it may match
later
(<a
href="https://redirect.github.com/benoitc/gunicorn/issues/1643">#1643</a>,
<a
href="https://redirect.github.com/benoitc/gunicorn/pull/3662">#3662</a>).</li>
</ul>
<h3>Security</h3>
<ul>
<li><strong>Dependency floors raised past known advisories</strong>:
every declared floor was
checked against the advisory database. <code>tornado</code>,
<code>h2</code>, <code>setuptools</code> and
<code>pymdown-extensions</code> permitted vulnerable versions and now
require the first
clean release; <code>pytest</code> and <code>httpx</code> were unpinned
and now carry floors. The
<code>tornado</code> example pinned <code>tornado&lt;6</code>, which was
both the source of several
advisories and older than the <code>&gt;=6.5.0</code> the tornado worker
needs, so the
example could not run as pinned.</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>
<p><strong>SIGHUP did not reload the logger configuration</strong>:
<code>Arbiter.reload()</code>
re-read the configuration file but kept using the logger built at
startup,
calling only <code>reopen_files()</code> on its existing handlers.
Changes to
<code>logconfig</code>, <code>logconfig_dict</code>,
<code>logconfig_json</code> and <code>loglevel</code> were ignored
until a full restart, which in containers meant replacing the pod. The
existing logger now re-runs its setup on reload, so new handlers,
formats
and levels take effect while the process identity and its listeners are
preserved, and re-running the setup no longer stacks duplicate syslog
handlers. An invalid log configuration on reload is not fatal either:
the
error is reported on stderr, the previous working configuration is
restored
and the master keeps running with it
(<a
href="https://redirect.github.com/benoitc/gunicorn/issues/3353">#3353</a>).</p>
</li>
<li>
<p><strong>Truncated chunked bodies accepted</strong>: RFC 9112 section
7.1.2 ends a chunked
body with <code>0 CRLF CRLF</code>, the second CRLF being the mandatory
empty trailer
section. <code>ChunkedReader.parse_chunk_size()</code> swallowed the
<code>NoMoreData</code> raised
while scanning for it, so a body cut short right after the last chunk
line was
treated as complete instead of rejected. It now raises
<code>ChunkMissingTerminator</code>
(<a
href="https://redirect.github.com/benoitc/gunicorn/issues/3382">#3382</a>,
<a
href="https://redirect.github.com/benoitc/gunicorn/pull/3685">#3685</a>).</p>
</li>
<li>
<p><strong><code>--spew</code> crashed on dynamically generated
code</strong>: the trace hook indexed the
2-tuple returned by <code>inspect.getsourcelines()</code> by line number
rather than
indexing the list of lines, so a frame with no <code>__file__</code>
raised
<code>AttributeError: 'int' object has no attribute 'rstrip'</code> on
line 1 and</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/benoitc/gunicorn/commit/71b59a75820dd4a762dc42a3280124168b4e44a8"><code>71b59a7</code></a>
Merge pull request <a
href="https://redirect.github.com/benoitc/gunicorn/issues/3698">#3698</a>
from benoitc/fix/docker-health-check-readerror</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/48287de8d8360825c85ac981ddfe9c80dba3b418"><code>48287de</code></a>
test: catch every transport error in the docker health check</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/3110e8c37f716ca0ed63ca7f80c7c9ea0fbbdd50"><code>3110e8c</code></a>
Merge pull request <a
href="https://redirect.github.com/benoitc/gunicorn/issues/3696">#3696</a>
from benoitc/docs/roadmap</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/cc56c410b7103c1f2b877279f81cb3a14705315a"><code>cc56c41</code></a>
Merge pull request <a
href="https://redirect.github.com/benoitc/gunicorn/issues/3693">#3693</a>
from benoitc/release/26.1.0</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/5cf1f1651a40fa36afe13fde623e3437ca872463"><code>5cf1f16</code></a>
docs: surface the roadmap on the site home page</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/7e35f72d135056c37da321becf22b19aeec06937"><code>7e35f72</code></a>
docs: add FastCGI to the roadmap and point items at Ideas</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/18ddc586c9b9513b25e92c6ed6f818f66ff3abcd"><code>18ddc58</code></a>
docs: drop the framework and reverse-proxy non-goals from the
roadmap</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/1ecae56ebd096ee4f94d12c59a36f240ce348572"><code>1ecae56</code></a>
docs: add a roadmap and make the chat easy to find</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/ca412e3f7134bd9f0e91851778ae6d8dd222cf41"><code>ca412e3</code></a>
docs: sync the Latest changelog page with 26.1.0</li>
<li><a
href="https://github.com/benoitc/gunicorn/commit/640936fb29f7bdf5665d5b7f919783bb73e2f981"><code>640936f</code></a>
docs: note the dependency security work in 26.1.0</li>
<li>Additional commits viewable in <a
href="https://github.com/benoitc/gunicorn/compare/26.0.0...26.1.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `idna` from 3.18 to 3.19
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/kjd/idna/releases">idna's
releases</a>.</em></p>
<blockquote>
<h2>v3.19</h2>
<ul>
<li>Restore the <code>std3_rules</code> option, which had no effect
since changes
to UTS <a href="https://redirect.github.com/kjd/idna/issues/46">#46</a>
processing in Unicode 16. Note that <code>uts46_remap()</code>
defaults to enabling STD3 rules, so direct callers will see input
containing non-LDH ASCII characters rejected again.</li>
<li>Performance improvements to UTS <a
href="https://redirect.github.com/kjd/idna/issues/46">#46</a> mapping,
particularly for
ASCII-only domains.</li>
<li>Test on free-threaded CPython with the GIL disabled and document
thread safety.</li>
<li>Expose the Unicode version of the generated tables as
<code>idna.unicode_version</code>, and show it in <code>idna
--version</code>.</li>
<li>Add <code>code</code>, <code>text</code>, <code>codepoint</code> and
<code>position</code> attributes to
<code>IDNAError</code> so that the failed rule and the offending
character can
be identified without parsing the exception message.</li>
<li>The deprecated <code>transitional</code> argument to
<code>encode()</code> and
<code>uts46_remap()</code> is now completely ignored, and gives a
deprecation warning
for the latter.</li>
<li>Reject A-labels that are not the canonical Punycode encoding of
their U-label.</li>
<li>Fix CONTEXTJ violations raising <code>IDNAError</code> instead of
<code>InvalidCodepointContext</code>.</li>
<li>Consistently raise <code>IDNAError</code> for empty labels and
non-ASCII bytes
passed to label helper functions and the incremental codec.</li>
<li>Add property-based tests, extended fuzzing targets, coverage
measurement, and CI checks that the data tables match the generator
output.</li>
<li>Various code quality and tooling improvements.</li>
</ul>
<p>Thanks to stefan6419846, LouieLuNZ, and Salvatore Corvaglia for
contributions to this release.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/kjd/idna/blob/master/HISTORY.md">idna's
changelog</a>.</em></p>
<blockquote>
<h2>3.19 (2026-08-18)</h2>
<ul>
<li>Restore the <code>std3_rules</code> option, which had no effect
since changes
to UTS <a href="https://redirect.github.com/kjd/idna/issues/46">#46</a>
processing in Unicode 16. Note that <code>uts46_remap()</code>
defaults to enabling STD3 rules, so direct callers will see input
containing non-LDH ASCII characters rejected again.</li>
<li>Performance improvements to UTS <a
href="https://redirect.github.com/kjd/idna/issues/46">#46</a> mapping,
particularly for
ASCII-only domains.</li>
<li>Test on free-threaded CPython with the GIL disabled and document
thread safety.</li>
<li>Expose the Unicode version of the generated tables as
<code>idna.unicode_version</code>, and show it in <code>idna
--version</code>.</li>
<li>Add <code>code</code>, <code>text</code>, <code>codepoint</code> and
<code>position</code> attributes to
<code>IDNAError</code> so that the failed rule and the offending
character can
be identified without parsing the exception message.</li>
<li>The deprecated <code>transitional</code> argument to
<code>encode()</code> and
<code>uts46_remap()</code> is now completely ignored, and gives a
deprecation warning
for the latter.</li>
<li>Reject A-labels that are not the canonical Punycode encoding of
their U-label.</li>
<li>Fix CONTEXTJ violations raising <code>IDNAError</code> instead of
<code>InvalidCodepointContext</code>.</li>
<li>Consistently raise <code>IDNAError</code> for empty labels and
non-ASCII bytes
passed to label helper functions and the incremental codec.</li>
<li>Add property-based tests, extended fuzzing targets, coverage
measurement, and CI checks that the data tables match the generator
output.</li>
<li>Various code quality and tooling improvements.</li>
</ul>
<p>Thanks to stefan6419846, LouieLuNZ, and Salvatore Corvaglia for
contributions to this release.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/kjd/idna/commit/03a9a11dd8aecd4fea742cabe20f4d3d9ed82abb"><code>03a9a11</code></a>
Release 3.19</li>
<li><a
href="https://github.com/kjd/idna/commit/2d2a7ef0c59210a48407b3dde6d884933cecf093"><code>2d2a7ef</code></a>
Pre-release 3.19rc0</li>
<li><a
href="https://github.com/kjd/idna/commit/5cce1308d148019c5fa0febceafa13e99cdacfe7"><code>5cce130</code></a>
Merge pull request <a
href="https://redirect.github.com/kjd/idna/issues/268">#268</a> from
kjd/fix-std3-regex-alert</li>
<li><a
href="https://github.com/kjd/idna/commit/3914b75f3e4cbc11e59f92eeecdb16d10871e57f"><code>3914b75</code></a>
Split the STD3 disallowed-character range so uppercase is explicit</li>
<li><a
href="https://github.com/kjd/idna/commit/ce9fd98ac4073866db276e93834b259f2a5a4ac4"><code>ce9fd98</code></a>
Merge pull request <a
href="https://redirect.github.com/kjd/idna/issues/267">#267</a> from
kjd/housekeeping</li>
<li><a
href="https://github.com/kjd/idna/commit/809240c3cc9358c9c9c79b2d12ffe39e75ccfb0f"><code>809240c</code></a>
Fail CI when the license copyright year is behind the current year</li>
<li><a
href="https://github.com/kjd/idna/commit/d9e16c523d7d25dcc14100fa80f3e303404e09be"><code>d9e16c5</code></a>
Consolidate test fixtures, prune stale gitignore entries, and fix doc
typos</li>
<li><a
href="https://github.com/kjd/idna/commit/ef30feeed3a758e96286fdab0315a551f7f5e7d6"><code>ef30fee</code></a>
Remove dead code and pare back superfluous comments</li>
<li><a
href="https://github.com/kjd/idna/commit/b907913f854d26cc714f721c6c2cb626d41ac468"><code>b907913</code></a>
Tighten the version support and Unicode notes in the README</li>
<li><a
href="https://github.com/kjd/idna/commit/6204cbe343ef438df7c58bc80b94d0f960991d90"><code>6204cbe</code></a>
Ignore local build artifacts and stop packaging stray tooling
config</li>
<li>Additional commits viewable in <a
href="https://github.com/kjd/idna/compare/v3.18...v3.19">compare
view</a></li>
</ul>
</details>
<br />

Updates `pygments` from 2.20.0 to 2.21.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pygments/pygments/releases">pygments's
releases</a>.</em></p>
<blockquote>
<h2>2.21.0</h2>
<ul>
<li>
<p>New lexers:</p>
<ul>
<li>BitBake (<a
href="https://redirect.github.com/pygments/pygments/issues/3103">#3103</a>)</li>
<li>Caddyfile (<a
href="https://redirect.github.com/pygments/pygments/issues/3225">#3225</a>)</li>
<li>CEL (<a
href="https://redirect.github.com/pygments/pygments/issues/3048">#3048</a>)</li>
<li>PureScript (<a
href="https://redirect.github.com/pygments/pygments/issues/1077">#1077</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/3054">#3054</a>)</li>
</ul>
</li>
<li>
<p>Updated lexers:</p>
<ul>
<li>Bash: Fix coloured keyword at the beginning of a name (<a
href="https://redirect.github.com/pygments/pygments/issues/2926">#2926</a>)</li>
<li>Boogie: Add missing Boogie and Civl Verifier keywords (<a
href="https://redirect.github.com/pygments/pygments/issues/3156">#3156</a>)</li>
<li>C#:
<ul>
<li>Recognize interpolated verbatim strings with either <code>$@</code>
or <code>@$</code>
prefixes (<a
href="https://redirect.github.com/pygments/pygments/issues/2685">#2685</a>)</li>
<li>Support dollar-prefixed and multi-quote raw strings (<a
href="https://redirect.github.com/pygments/pygments/issues/3129">#3129</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2897">#2897</a>)</li>
<li>Recognize <code>union</code> (<a
href="https://redirect.github.com/pygments/pygments/issues/3182">#3182</a>)</li>
</ul>
</li>
<li>C/C++:
<ul>
<li>Add C23/C++26 attributes (<a
href="https://redirect.github.com/pygments/pygments/issues/3084">#3084</a>)</li>
<li>Add more C2Y keywords (<a
href="https://redirect.github.com/pygments/pygments/issues/3092">#3092</a>)</li>
<li>Highlight a function following a namespace body (<a
href="https://redirect.github.com/pygments/pygments/issues/2928">#2928</a>)</li>
<li>Fix C/C++ lexer support for multiline pre-processor comments (<a
href="https://redirect.github.com/pygments/pygments/issues/3051">#3051</a>)</li>
<li>Add <code>.ipp</code> as a file extension (<a
href="https://redirect.github.com/pygments/pygments/issues/3141">#3141</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/1008">#1008</a>)</li>
</ul>
</li>
<li>Clojure: Recognize named, octal and unicode character literals such
as
<code>\space</code> and <code>\o377</code> as a single token (<a
href="https://redirect.github.com/pygments/pygments/issues/979">#979</a>)</li>
<li>Csound: Add missing opcode parameter type letter (<a
href="https://redirect.github.com/pygments/pygments/issues/3161">#3161</a>)</li>
<li>CUDA: Derive from the C++ lexer instead of C to highlight C++
constructs such as <code>template</code>, <code>class</code> and
<code>namespace</code> (<a
href="https://redirect.github.com/pygments/pygments/issues/3127">#3127</a>)</li>
<li>D: Allow non-ASCII (Unicode) identifiers (<a
href="https://redirect.github.com/pygments/pygments/issues/1088">#1088</a>)</li>
<li>Fish: Fix single quote backslash escape (<a
href="https://redirect.github.com/pygments/pygments/issues/3138">#3138</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2821">#2821</a>)</li>
<li>Go: Various lexer improvements (<a
href="https://redirect.github.com/pygments/pygments/issues/3199">#3199</a>)</li>
<li>GoogleSQL: Require a word break after <code>SET</code> (<a
href="https://redirect.github.com/pygments/pygments/issues/3167">#3167</a>)</li>
<li>Hexdump: Only match valid digits (<a
href="https://redirect.github.com/pygments/pygments/issues/3200">#3200</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2847">#2847</a>)</li>
<li>JavaScript: Highlight the <code>arguments</code> object (<a
href="https://redirect.github.com/pygments/pygments/issues/3146">#3146</a>)</li>
<li>Jsonnet: Recognize colons in array slice expressions (<a
href="https://redirect.github.com/pygments/pygments/issues/2828">#2828</a>)</li>
<li>JSX: Allow apostrophes in element text (<a
href="https://redirect.github.com/pygments/pygments/issues/2816">#2816</a>)</li>
<li>Julia: Fix rstrings backslash (<a
href="https://redirect.github.com/pygments/pygments/issues/3140">#3140</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2537">#2537</a>)</li>
<li>Kotlin: Support companion objects without an explicit name (<a
href="https://redirect.github.com/pygments/pygments/issues/2525">#2525</a>)</li>
<li>Kotlin: Don't let a nullable type marker (<code>?</code>) consume
the following
character, so <code>Foo?,</code> and <code>a?:b</code> tokenize
correctly (<a
href="https://redirect.github.com/pygments/pygments/issues/2964">#2964</a>)</li>
<li>Kusto: Recognize member-access dots in dynamic objects (<a
href="https://redirect.github.com/pygments/pygments/issues/2779">#2779</a>)</li>
<li>Lua: Various improvements (<a
href="https://redirect.github.com/pygments/pygments/issues/3143">#3143</a>)</li>
<li>Macaulay2: Update symbols to 1.26.05 (<a
href="https://redirect.github.com/pygments/pygments/issues/3120">#3120</a>)</li>
<li>Markdown:
<ul>
<li>Highlight bold-italics (<code>***...***</code> and
<code>___...___</code>) (<a
href="https://redirect.github.com/pygments/pygments/issues/3067">#3067</a>)</li>
<li>Fix mention regex to support hyphens in usernames (<a
href="https://redirect.github.com/pygments/pygments/issues/3139">#3139</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/3135">#3135</a>)</li>
</ul>
</li>
<li>Markdown, reStructuredText, TiddlyWiki5: Fix wrong token offsets for
embedded code blocks (<a
href="https://redirect.github.com/pygments/pygments/issues/3133">#3133</a>)</li>
<li>Mathematica: Recognize <code>\[Name]</code> named-character escapes
such as
<code>\[Nu]</code> instead of emitting an <code>Error</code> token (<a
href="https://redirect.github.com/pygments/pygments/issues/3097">#3097</a>)</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pygments/pygments/blob/master/CHANGES">pygments's
changelog</a>.</em></p>
<blockquote>
<h2>Version 2.21.0</h2>
<p>(released August 17th, 2026)</p>
<ul>
<li>
<p>New lexers:</p>
<ul>
<li>BitBake (<a
href="https://redirect.github.com/pygments/pygments/issues/3103">#3103</a>)</li>
<li>Caddyfile (<a
href="https://redirect.github.com/pygments/pygments/issues/3225">#3225</a>)</li>
<li>CEL (<a
href="https://redirect.github.com/pygments/pygments/issues/3048">#3048</a>)</li>
<li>PureScript (<a
href="https://redirect.github.com/pygments/pygments/issues/1077">#1077</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/3054">#3054</a>)</li>
</ul>
</li>
<li>
<p>Updated lexers:</p>
<ul>
<li>Bash: Fix coloured keyword at the beginning of a name (<a
href="https://redirect.github.com/pygments/pygments/issues/2926">#2926</a>)</li>
<li>Boogie: Add missing Boogie and Civl Verifier keywords (<a
href="https://redirect.github.com/pygments/pygments/issues/3156">#3156</a>)</li>
<li>C#:
<ul>
<li>Recognize interpolated verbatim strings with either <code>$@</code>
or <code>@$</code>
prefixes (<a
href="https://redirect.github.com/pygments/pygments/issues/2685">#2685</a>)</li>
<li>Support dollar-prefixed and multi-quote raw strings (<a
href="https://redirect.github.com/pygments/pygments/issues/3129">#3129</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2897">#2897</a>)</li>
<li>Recognize <code>union</code> (<a
href="https://redirect.github.com/pygments/pygments/issues/3182">#3182</a>)</li>
</ul>
</li>
<li>C/C++:
<ul>
<li>Add C23/C++26 attributes (<a
href="https://redirect.github.com/pygments/pygments/issues/3084">#3084</a>)</li>
<li>Add more C2Y keywords (<a
href="https://redirect.github.com/pygments/pygments/issues/3092">#3092</a>)</li>
<li>Highlight a function following a namespace body (<a
href="https://redirect.github.com/pygments/pygments/issues/2928">#2928</a>)</li>
<li>Fix C/C++ lexer support for multiline pre-processor comments (<a
href="https://redirect.github.com/pygments/pygments/issues/3051">#3051</a>)</li>
<li>Add <code>.ipp</code> as a file extension (<a
href="https://redirect.github.com/pygments/pygments/issues/3141">#3141</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/1008">#1008</a>)</li>
</ul>
</li>
<li>Clojure: Recognize named, octal and unicode character literals such
as
<code>\space</code> and <code>\o377</code> as a single token (<a
href="https://redirect.github.com/pygments/pygments/issues/979">#979</a>)</li>
<li>Csound: Add missing opcode parameter type letter (<a
href="https://redirect.github.com/pygments/pygments/issues/3161">#3161</a>)</li>
<li>CUDA: Derive from the C++ lexer instead of C to highlight C++
constructs such as <code>template</code>, <code>class</code> and
<code>namespace</code> (<a
href="https://redirect.github.com/pygments/pygments/issues/3127">#3127</a>)</li>
<li>D: Allow non-ASCII (Unicode) identifiers (<a
href="https://redirect.github.com/pygments/pygments/issues/1088">#1088</a>)</li>
<li>Fish: Fix single quote backslash escape (<a
href="https://redirect.github.com/pygments/pygments/issues/3138">#3138</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2821">#2821</a>)</li>
<li>Go: Various lexer improvements (<a
href="https://redirect.github.com/pygments/pygments/issues/3199">#3199</a>)</li>
<li>GoogleSQL: Require a word break after <code>SET</code> (<a
href="https://redirect.github.com/pygments/pygments/issues/3167">#3167</a>)</li>
<li>Hexdump: Only match valid digits (<a
href="https://redirect.github.com/pygments/pygments/issues/3200">#3200</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2847">#2847</a>)</li>
<li>JavaScript: Highlight the <code>arguments</code> object (<a
href="https://redirect.github.com/pygments/pygments/issues/3146">#3146</a>)</li>
<li>Jsonnet: Recognize colons in array slice expressions (<a
href="https://redirect.github.com/pygments/pygments/issues/2828">#2828</a>)</li>
<li>JSX: Allow apostrophes in element text (<a
href="https://redirect.github.com/pygments/pygments/issues/2816">#2816</a>)</li>
<li>Julia: Fix rstrings backslash (<a
href="https://redirect.github.com/pygments/pygments/issues/3140">#3140</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/2537">#2537</a>)</li>
<li>Kotlin: Support companion objects without an explicit name (<a
href="https://redirect.github.com/pygments/pygments/issues/2525">#2525</a>)</li>
<li>Kotlin: Don't let a nullable type marker (<code>?</code>) consume
the following
character, so <code>Foo?,</code> and <code>a?:b</code> tokenize
correctly (<a
href="https://redirect.github.com/pygments/pygments/issues/2964">#2964</a>)</li>
<li>Kusto: Recognize member-access dots in dynamic objects (<a
href="https://redirect.github.com/pygments/pygments/issues/2779">#2779</a>)</li>
<li>Lua: Various improvements (<a
href="https://redirect.github.com/pygments/pygments/issues/3143">#3143</a>)</li>
<li>Macaulay2: Update symbols to 1.26.05 (<a
href="https://redirect.github.com/pygments/pygments/issues/3120">#3120</a>)</li>
<li>Markdown:
<ul>
<li>Highlight bold-italics (<code>***...***</code> and
<code>___...___</code>) (<a
href="https://redirect.github.com/pygments/pygments/issues/3067">#3067</a>)</li>
<li>Fix mention regex to support hyphens in usernames (<a
href="https://redirect.github.com/pygments/pygments/issues/3139">#3139</a>,
<a
href="https://redirect.github.com/pygments/pygments/issues/3135">#3135</a>)</li>
</ul>
</li>
<li>Markdown, reStructuredText, TiddlyWiki5: Fix wrong token offsets
for</li>
</ul>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/pygments/pygments/commit/a43b45dcf081b6010c6ab4428f149f7f6d2499c4"><code>a43b45d</code></a>
Get ready for the 2.21.0 release.</li>
<li><a
href="https://github.com/pygments/pygments/commit/d8f14cb395026abb288db38839f57499cba695e0"><code>d8f14cb</code></a>
Fix version_added for Purescript.</li>
<li><a
href="https://github.com/pygments/pygments/commit/19c581704c466cde59fd1a49e04c3424449110f3"><code>19c5817</code></a>
Remove superfluous parentheses from PostgresExplainLexer (<a
href="https://redirect.github.com/pygments/pygments/issues/3232">#3232</a>)</li>
<li><a
href="https://github.com/pygments/pygments/commit/9992e0992ad273565f19ffb1b4c9cae96cd8dd00"><code>9992e09</code></a>
Merge pull request <a
href="https://redirect.github.com/pygments/pygments/issues/3191">#3191</a>
from jvoisin/dupes</li>
<li><a
href="https://github.com/pygments/pygments/commit/bd225771e856b79e8cb5b81533e1eba0cf9fbf85"><code>bd22577</code></a>
Fix regexlint warnings after latest update.</li>
<li><a
href="https://github.com/pygments/pygments/commit/6a62df1d1fc77af7e9fc61325ef376297cadffbb"><code>6a62df1</code></a>
Release preparation: Update the changelog.</li>
<li><a
href="https://github.com/pygments/pygments/commit/aabba32860b5ba15acabdcba9b436a32e92ce75e"><code>aabba32</code></a>
Merge pull request <a
href="https://redirect.github.com/pygments/pygments/issues/3221">#3221</a>
from jvoisin/alter</li>
<li><a
href="https://github.com/pygments/pygments/commit/d3441d00a33467255b8b3ae9862f454e3aa58e3d"><code>d3441d0</code></a>
Merge pull request <a
href="https://redirect.github.com/pygments/pygments/issues/3225">#3225</a>
from jvoisin/caddy</li>
<li><a
href="https://github.com/pygments/pygments/commit/c593f3f2f69e09670e58a121437a3c830a643071"><code>c593f3f</code></a>
Add a lexer for Caddy</li>
<li><a
href="https://github.com/pygments/pygments/commit/0644b532c8df1dd67b26471871d432d100252a11"><code>0644b53</code></a>
Simplify single-character regex alternations to character classes</li>
<li>Additional commits viewable in <a
href="https://github.com/pygments/pygments/compare/2.20.0...2.21.0">compare
view</a></li>
</ul>
</details>
<br />

Updates `uvicorn` from 0.52.3 to 0.52.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/uvicorn/releases">uvicorn's
releases</a>.</em></p>
<blockquote>
<h2>Version 0.52.4</h2>
<h3>Fixed</h3>
<ul>
<li>Remove duplicate <code>Date</code> headers from accepted WebSocket
handshakes with <code>websockets-sansio</code> (<a
href="https://redirect.github.com/Kludex/uvicorn/pull/3078">#3078</a>)</li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/Kludex/uvicorn/compare/0.52.3...0.52.4">https://github.com/Kludex/uvicorn/compare/0.52.3...0.52.4</a></p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md">uvicorn's
changelog</a>.</em></p>
<blockquote>
<h2>0.52.4 (August 18, 2026)</h2>
<h3>Fixed</h3>
<ul>
<li>Remove duplicate <code>Date</code> headers from accepted WebSocket
handshakes with <code>websockets-sansio</code> (<a
href="https://redirect.github.com/Kludex/uvicorn/pull/3078">#3078</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/Kludex/uvicorn/commit/8988c23704fc373c9206cca53ec57dd8ad7f44a5"><code>8988c23</code></a>
Stabilize macOS Python 3.13 signal shutdown tests (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3084">#3084</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/898ddca9254b53c5bf7a6ee509756704caaa949f"><code>898ddca</code></a>
Update PyPI publish action to version 1.14.2 (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3083">#3083</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/3869f8aac2bdd040fa3fbe564e1dad67e2637641"><code>3869f8a</code></a>
Restore Mermaid diagram rendering (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3080">#3080</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/64148a9c574e1eb87d3d09b3ce4c256606f8d973"><code>64148a9</code></a>
Version 0.52.4 (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3079">#3079</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/9e9e5691bd14d5c4cd66d9bd76c7730bc48461a2"><code>9e9e569</code></a>
docs: correct release example PR number (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3072">#3072</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/b783dacab50b9d6767b0cf65826b2dc3aae21909"><code>b783dac</code></a>
Remove duplicate Date header from SansIO WebSocket handshakes (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3078">#3078</a>)</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/27019b2a4b1fa6d68a289fcf7d738fbdc6ee4e5d"><code>27019b2</code></a>
chore(deps): bump the python-packages group across 1 directory with 11
update...</li>
<li><a
href="https://github.com/Kludex/uvicorn/commit/1b6427311bb84a15addee688f6d41d96e33f8b0a"><code>1b64273</code></a>
Fix a typo in index.md (<a
href="https://redirect.github.com/Kludex/uvicorn/issues/3006">#3006</a>)</li>
<li>See full diff in <a
href="https://github.com/Kludex/uvicorn/compare/0.52.3...0.52.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `python-dotenv` from 1.2.2 to 1.2.3
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/theskumar/python-dotenv/releases">python-dotenv's
releases</a>.</em></p>
<blockquote>
<h2>v1.2.3</h2>
<h3>Fixed</h3>
<ul>
<li>Strip a leading UTF-8 BOM from <code>.env</code> file contents so
the first variable is no longer silently lost when the file is saved
with BOM (e.g. by some JetBrains IDEs on Windows) by [<a
href="https://github.com/h1whelan"><code>@​h1whelan</code></a>] in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/640">#640</a></li>
<li><code>set_key</code> now escapes backslashes, so values containing
them (Windows paths, regular expressions) survive a write/read
round-trip. Quoted values ending in an escaped backslash are no longer
mis-parsed as an escaped quote, which used to swallow the following
lines by [<a
href="https://github.com/dchaudhari7177"><code>@​dchaudhari7177</code></a>]
in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a></li>
<li><code>dotenv run</code> now prints a friendly error instead of a
traceback when no command is given by [<a
href="https://github.com/bbc2"><code>@​bbc2</code></a>] in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/606">#606</a></li>
<li>Cache the parsed result for empty <code>.env</code> files so
repeated <code>dotenv_values</code>/<code>load_dotenv</code> calls no
longer re-read the file by [<a
href="https://github.com/ReinerBRO"><code>@​ReinerBRO</code></a>] in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/638">#638</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/theskumar/python-dotenv/blob/main/CHANGELOG.md">python-dotenv's
changelog</a>.</em></p>
<blockquote>
<h2>[1.2.3] - 2026-08-16</h2>
<h3>Fixed</h3>
<ul>
<li>Strip a leading UTF-8 BOM from <code>.env</code> file contents so
the first variable is no longer silently lost when the file is saved
with BOM (e.g. by some JetBrains IDEs on Windows) by [<a
href="https://github.com/h1whelan"><code>@​h1whelan</code></a>] in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/640">#640</a></li>
<li><code>set_key</code> now escapes backslashes, so values containing
them (Windows paths, regular expressions) survive a write/read
round-trip. Quoted values ending in an escaped backslash are no longer
mis-parsed as an escaped quote, which used to swallow the following
lines by [<a
href="https://github.com/dchaudhari7177"><code>@​dchaudhari7177</code></a>]
in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a></li>
<li><code>dotenv run</code> now prints a friendly error instead of a
traceback when no command is given by [<a
href="https://github.com/bbc2"><code>@​bbc2</code></a>] in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/606">#606</a></li>
<li>Cache the parsed result for empty <code>.env</code> files so
repeated <code>dotenv_values</code>/<code>load_dotenv</code> calls no
longer re-read the file by [<a
href="https://github.com/ReinerBRO"><code>@​ReinerBRO</code></a>] in <a
href="https://redirect.github.com/theskumar/python-dotenv/issues/638">#638</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/49515afee2d50c33cad9419b3800b3a0dc93fc59"><code>49515af</code></a>
Bump version: 1.2.2 → 1.2.3</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/8ac846ff2760b65470e769d7eed33e540f0934e1"><code>8ac846f</code></a>
chore: add release runbook (RELEASING.md) and make release target</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/bb31c944fb4b40e8dea59587f525840c38326166"><code>bb31c94</code></a>
docs: add 1.2.3 release notes (<a
href="https://redirect.github.com/theskumar/python-dotenv/issues/606">#606</a>,
<a
href="https://redirect.github.com/theskumar/python-dotenv/issues/638">#638</a>,
<a
href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a>)</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/f7b18d9c72d1abcc2ad4023424b84f5bee30d266"><code>f7b18d9</code></a>
fix: round-trip backslashes through set_key (<a
href="https://redirect.github.com/theskumar/python-dotenv/issues/680">#680</a>)</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/751f8c148222e58aa173c83c4e5e6cfccb2cc124"><code>751f8c1</code></a>
ci(deps): bump actions/checkout from 6.0.2 to 6.0.3 in the
github-actions gro...</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/f1937b68f338d7ebd7754da377ca08b2f0df8dbb"><code>f1937b6</code></a>
chore(deps): update mkdocs-include-markdown-plugin requirement from
&gt;=6.0.0 t...</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/45b93720dd5e9e127d0be3971a04855d34e464d8"><code>45b9372</code></a>
chore(deps): update pytest requirement from &gt;=3.9 to &gt;=9.0.3 (<a
href="https://redirect.github.com/theskumar/python-dotenv/issues/653">#653</a>)</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/72896e9244d2a1ff8d5e1934d3df8a35c813799a"><code>72896e9</code></a>
docs: fix broken mkdocs link in CONTRIBUTING.md (<a
href="https://redirect.github.com/theskumar/python-dotenv/issues/636">#636</a>)</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/72754a16a4743e4c92edf87ce59ba0e4ff78758d"><code>72754a1</code></a>
ci(deps): bump peaceiris/actions-gh-pages from 4.0.0 to 4.1.0 in the
github-a...</li>
<li><a
href="https://github.com/theskumar/python-dotenv/commit/078325e92558330e9addc661b789c7b6123fa73c"><code>078325e</code></a>
ci(security): harden CI/CD supply chain with SHA pinning and
least-privilege ...</li>
<li>Additional commits viewable in <a
href="https://github.com/theskumar/python-dotenv/compare/v1.2.2...v1.2.3">compare
view</a></li>
</ul>
</details>
<br />

Updates `google-api-python-client` from 2.198.0 to 2.199.0
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/googleapis/google-api-python-client/releases">google-api-python-client's
releases</a>.</em></p>
<blockquote>
<h2>v2.199.0</h2>
<h2><a
href="https://github.com/googleapis/google-api-python-client/compare/v2.198.0...v2.199.0">2.199.0</a>
(2026-08-20)</h2>
<h3>Features</h3>
<ul>
<li><strong>accesscontextmanager:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/902cd298442117caddbe81d4cdf6352547e5ebf9">https://togithub.com/googleapis/google-api-python-client/commit/902cd298442117caddbe81d4cdf6352547e5ebf9</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>accesscontextmanager:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/afaf4fd47b727c33fd1a944d04f4a59b67821da4">https://togithub.com/googleapis/google-api-python-client/commit/afaf4fd47b727c33fd1a944d04f4a59b67821da4</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>admin:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/6cde8833628a99665ff55584aba362a28fec5048">https://togithub.com/googleapis/google-api-python-client/commit/6cde8833628a99665ff55584aba362a28fec5048</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>agentregistry:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/9b1d99cdcf7c4f0ecc4b4ff485c67c08b02472fa">https://togithub.com/googleapis/google-api-python-client/commit/9b1d99cdcf7c4f0ecc4b4ff485c67c08b02472fa</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>aiplatform:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/11ebd1d4065691d097b7ed6a626c3056061efea0">https://togithub.com/googleapis/google-api-python-client/commit/11ebd1d4065691d097b7ed6a626c3056061efea0</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>aiplatform:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/202447756c729b95d81cd6e36c2ad01d0e529854">https://togithub.com/googleapis/google-api-python-client/commit/202447756c729b95d81cd6e36c2ad01d0e529854</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>aiplatform:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/d33acf4353b2900d7edc8733640cf2341cba660a">https://togithub.com/googleapis/google-api-python-client/commit/d33acf4353b2900d7edc8733640cf2341cba660a</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li>
<li><strong>alloydb:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/a8fab1fb81930c8267b11aef2384bce76c6f0068">https://togithub.com/googleapis/google-api-python-client/commit/a8fab1fb81930c8267b11aef2384bce76c6f0068</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>alloydb:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/dcf16ca5d8e2b66a3db23a412e1e56d8a9096e2a">https://togithub.com/googleapis/google-api-python-client/commit/dcf16ca5d8e2b66a3db23a412e1e56d8a9096e2a</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>analyticshub:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/17ef99fa72736546124c97910b3b1318992ccdbc">https://togithub.com/googleapis/google-api-python-client/commit/17ef99fa72736546124c97910b3b1318992ccdbc</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>androidenterprise:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/e97fb8ad3d62dbb723f4b332f7c00452cc33825a">https://togithub.com/googleapis/google-api-python-client/commit/e97fb8ad3d62dbb723f4b332f7c00452cc33825a</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>androidmanagement:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/96073c61dad69df63e3da8f8fb96082b1aad5c66">https://togithub.com/googleapis/google-api-python-client/commit/96073c61dad69df63e3da8f8fb96082b1aad5c66</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>androidpublisher:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/186734b25a3b026609d01fece0547795d33a84b8">https://togithub.com/googleapis/google-api-python-client/commit/186734b25a3b026609d01fece0547795d33a84b8</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li>
<li><strong>androidpublisher:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/24cda798f95f49894ceb5004fa84bf51435eff7c">https://togithub.com/googleapis/google-api-python-client/commit/24cda798f95f49894ceb5004fa84bf51435eff7c</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>androidpublisher:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/88bcd1c6f08c65a9b2b0de7ac02ac88c79811b38">https://togithub.com/googleapis/google-api-python-client/commit/88bcd1c6f08c65a9b2b0de7ac02ac88c79811b38</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>apigee:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/9636e977115e0667eda725cf71dd176ddbead6d4">https://togithub.com/googleapis/google-api-python-client/commit/9636e977115e0667eda725cf71dd176ddbead6d4</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li>
<li><strong>apigee:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/ee13aa4fe890a298d48532b319c3c34a5c9cb051">https://togithub.com/googleapis/google-api-python-client/commit/ee13aa4fe890a298d48532b319c3c34a5c9cb051</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>apihub:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/f08679562db776eca7dfec1277e72adca625ac90">https://togithub.com/googleapis/google-api-python-client/commit/f08679562db776eca7dfec1277e72adca625ac90</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>apikeys:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/212766b05def99a351b9c3690ae86b436a24d01c">https://togithub.com/googleapis/google-api-python-client/commit/212766b05def99a351b9c3690ae86b436a24d01c</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>appengine:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/4e6761a60132b51f74aad70dfd1eb0a6ea83e2d4">https://togithub.com/googleapis/google-api-python-client/commit/4e6761a60132b51f74aad70dfd1eb0a6ea83e2d4</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>artifactregistry:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/893163c920c217454775c2e8caa5cf5350ce06bc">https://togithub.com/googleapis/google-api-python-client/commit/893163c920c217454775c2e8caa5cf5350ce06bc</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>assuredworkloads:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/4e70ca7de7f56118da25ee956fef1106f3bfde77">https://togithub.com/googleapis/google-api-python-client/commit/4e70ca7de7f56118da25ee956fef1106f3bfde77</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>assuredworkloads:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/9f7839bf55755e0a5caa5d7da411402cbc6362d9">https://togithub.com/googleapis/google-api-python-client/commit/9f7839bf55755e0a5caa5d7da411402cbc6362d9</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li>
<li><strong>authorizedbuyersmarketplace:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/0f80196c6e289da777ce1d9b408b6389d01ec678">https://togithub.com/googleapis/google-api-python-client/commit/0f80196c6e289da777ce1d9b408b6389d01ec678</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>authorizedbuyersmarketplace:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/db313413c765ea7b91f38b671179a35343e73e9b">https://togithub.com/googleapis/google-api-python-client/commit/db313413c765ea7b91f38b671179a35343e73e9b</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>backupdr:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/f5233ef58b6cf1993a986a8ccb3b1c2884fb5222">https://togithub.com/googleapis/google-api-python-client/commit/f5233ef58b6cf1993a986a8ccb3b1c2884fb5222</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>batch:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/0007c340fb2333c084e967156fa8e2321a4615ef">https://togithub.com/googleapis/google-api-python-client/commit/0007c340fb2333c084e967156fa8e2321a4615ef</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>beyondcorp:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/55d13ccbd632ef78842cb4701d30af362aed59ed">https://togithub.com/googleapis/google-api-python-client/commit/55d13ccbd632ef78842cb4701d30af362aed59ed</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>biglake:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/fa81a9fbd72714f6e9cb7978235bfa4f63556889">https://togithub.com/googleapis/google-api-python-client/commit/fa81a9fbd72714f6e9cb7978235bfa4f63556889</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>bigqueryconnection:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/eca8f066a5e6f1cfb6e020c62fc84b6907fe2a5d">https://togithub.com/googleapis/google-api-python-client/commit/eca8f066a5e6f1cfb6e020c62fc84b6907fe2a5d</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>bigquerydatatransfer:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/220cfd714e1d9ce6502addf039b1eb768350f38a">https://togithub.com/googleapis/google-api-python-client/commit/220cfd714e1d9ce6502addf039b1eb768350f38a</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>bigqueryreservation:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/1c2fda49c8217f79111c31a996b26a6db06d468a">https://togithub.com/googleapis/google-api-python-client/commit/1c2fda49c8217f79111c31a996b26a6db06d468a</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>bigqueryreservation:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/5fd7f7e168980371272a5eb80809e1dc9e1c06fe">https://togithub.com/googleapis/google-api-python-client/commit/5fd7f7e168980371272a5eb80809e1dc9e1c06fe</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>bigquery:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/02a221cf2c8e518f2107ac328f583f7396f4c2b3">https://togithub.com/googleapis/google-api-python-client/commit/02a221cf2c8e518f2107ac328f583f7396f4c2b3</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>bigquery:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/dc3d306ce2139fe7173f17cc6d5286d12981da15">https://togithub.com/googleapis/google-api-python-client/commit/dc3d306ce2139fe7173f17cc6d5286d12981da15</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>bigtableadmin:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/ba1d4ca677893c457a46d62515ab3271f74db5a4">https://togithub.com/googleapis/google-api-python-client/commit/ba1d4ca677893c457a46d62515ab3271f74db5a4</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>bigtableadmin:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/c58c670814614f549ff8c8d7b2affd1c33965ad8">https://togithub.com/googleapis/google-api-python-client/commit/c58c670814614f549ff8c8d7b2affd1c33965ad8</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/499649978cbe0a66f7362348b0790f23674f7e03">4996499</a>)</li>
<li><strong>calendar:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/f4885d0eda944de8d6a8712c4fc78b8d1b29c7ba">https://togithub.com/googleapis/google-api-python-client/commit/f4885d0eda944de8d6a8712c4fc78b8d1b29c7ba</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>certificatemanager:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/11e53578ffaf28dfa97836dc63265d2fb6915ab5">https://togithub.com/googleapis/google-api-python-client/commit/11e53578ffaf28dfa97836dc63265d2fb6915ab5</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>ces:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/6195a7b6ae8aec3b7b3ab47a330af7acf973a0af">https://togithub.com/googleapis/google-api-python-client/commit/6195a7b6ae8aec3b7b3ab47a330af7acf973a0af</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>ces:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/6c0604ee3b8214caf807eb2e7a42952e41a91ced">https://togithub.com/googleapis/google-api-python-client/commit/6c0604ee3b8214caf807eb2e7a42952e41a91ced</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
<li><strong>chat:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/0e92eaf5dd691f58f44462f401fe93e89a11ce18">https://togithub.com/googleapis/google-api-python-client/commit/0e92eaf5dd691f58f44462f401fe93e89a11ce18</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/ce8b4331dddfa4026c2c97514720c4fb34650a18">ce8b433</a>)</li>
<li><strong>chat:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/183f95c88ce3a70e5cdd6787457068d9f245f646">https://togithub.com/googleapis/google-api-python-client/commit/183f95c88ce3a70e5cdd6787457068d9f245f646</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5636e618395a7af950ddf0349e2c3459dba33533">5636e61</a>)</li>
<li><strong>chat:</strong> Update the api <a
href="https://togithub.com/googleapis/google-api-python-client/commit/bf1e1f4ce0e2df50eeac19b34bee0fb5922cff50">https://togithub.com/googleapis/google-api-python-client/commit/bf1e1f4ce0e2df50eeac19b34bee0fb5922cff50</a>
(<a
href="https://github.com/googleapis/google-api-python-client/commit/5a3308b30416614913c0310efdea390d71418238">5a3308b</a>)</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/googleapis/google-api-python-client/commit/b0089df6768a806c3d837f71b5ba7eca79934e5a"><code>b0089df</code></a>
chore(main): release 2.199.0 (<a
href="https://redirect.github.com/googleapis/google-api-python-client/issues/2774">#2774</a>)</li>
<li><a
href="https://github.com/googleapis/google-api-python-client/commit/7b8de0bf590213897faf3092e64052ebfad04ffc"><code>7b8de0b</code></a>
fix: drop support for Python 3.7-3.9 (<a
href="https://redirect.github.com/googleapis/google-api-python-cli…
…(BDMS-974/1178) (#866)

BDMS-974/1178: Expand actively_monitored_wells to include wells from all
groups
### Why

- actively_monitored_wells filtered wells with WHERE lower(trim(g.name))
= 'water level network' — a string match on a group's display name,
restricting the layer to one group even though its name implies all
actively monitored wells.
- If that group were ever renamed, the filter would stop matching and
the layer would silently return zero rows with no error (Section 4.3,
R3).
- A separate proposal to rename this layer to water_level_network_wells
was withdrawn — the name was fine, the filter was just too narrow.

### How

- New Alembic migration (986e0eb85ab3) drops and recreates both
ogc_actively_monitored_wells and its internal mirror
ogc_internal_actively_monitored_wells, removing the group-name
predicate. The status_value = 'Currently monitored' filter is untouched
— that's the real definition of "actively monitored."
- Verified against production data first: confirmed via a real query
that no currently-monitored well has zero group memberships, so the
existing inner-join structure is safe as-is (no need to switch to a LEFT
JOIN).

- Wells belonging to multiple groups are aggregated into one row
(group_ids/group_names/group_types as parallel arrays) rather than one
row per group, so id stays unique for pygeoapi's id_field: id lookups —
verified live that duplicate rows silently broke /items/{id}.
- Deduplicates group_thing_association rows first (no unique constraint
exists on that table) and orders all three arrays by group_id, so they
stay correctly aligned with each other rather than each being sorted
independently.

- Added a test
(test_ogc_actively_monitored_wells_includes_wells_from_other_groups)
proving a well in a group other than Water Level Network now shows up.
- Rewrote the A4/A6 scenarios in ogc-cleanup-sprint1.feature, dropping
the old rename/deprecation-header scenarios and the stale hardcoded
"322" feature-count assertion (never matched real data in any
environment we checked).

### Notes
- Found and separately flagged (not fixed here): a duplicate group row
in prod, "water Level Network" (lowercase w) vs "Water Level Network",
holding one stray well (WL-0428). Worth a data-cleanup follow-up.

---------

Co-authored-by: likithabommasani21 <275146718+likithabommasani21@users.noreply.github.com>
BDMS-974 drops the "group name = 'water level network'" predicate from
ogc_actively_monitored_wells, so the layer now covers currently-monitored
wells in any group. The published prose still described the old filter and
would have shipped wrong the moment that migration ran.

The collection description now keys the layer on the monitoring status
alone, and says what the join actually produces: a well in several groups
appears once per group. That last point matters enough to repeat at field
level -- the id column is no longer unique within the collection, which
is the kind of thing a client discovers by having its keyed-by-id map
silently drop rows. group_name loses its claim that it is always the
Water Level Network.

Keywords drop water-level-network for monitoring-status.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
/ogcapi/collections/waterlevels/instances returned a 500:

    TypeError: 'NotImplementedError' object is not iterable

pygeoapi calls p.instances() and p.instance(id); this provider spelled
them get_instances() and get_instance(). Because BaseEDRProvider
*returns* a NotImplementedError instance from both rather than raising
one, the mismatch was silent -- /instances iterated that object, and
/instances/{id}/... validated the id against a truthy object, so any
identifier at all was accepted. Transducer deployments have therefore
never been reachable as EDR instances, which is exactly what the
waterlevels description advertises. Renamed; nothing called the old
names.

The behave feature that covers this has existed since ADR3 and caught it
on the first run, but it is tagged @backend @edr with no @production, and
CI runs "@backend and @production and not @Skip" -- so it has never run
there. Tagged @production.

Two fixture defects were hiding behind that, both of which made the
chemistry scenarios fail once the feature ran:

* The fixture seeded chemistry as observation rows, but d9e0f1a2b3c4
  rebuilt ogc_water_chemistry over the legacy NMA_* tables, so the
  collection saw nothing -- a 400 (pH is not a known parameter) and a
  204. It now seeds NMA_Chemistry_SampleInfo/NMA_FieldParameters and
  refreshes the materialized view, without which the rows stay invisible
  anyway.
* ogc_water_chemistry gates on the thing's release_status as well as the
  sample's, and wells seed as 'draft', so the fixture published no
  chemistry at all. It now promotes its own well to public.

Full production behave suite: 85 scenarios, 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ogc_waterlevels filtered on the reading's own release_status only, so a
well whose own release_status was 'draft' or 'private' still published
its public readings through OGC API - EDR -- with the well's name and
coordinates attached to every one of them. ogc_water_chemistry has
required the parent thing to be public since d9e0f1a2b3c4; this brings
water levels onto the same rule, which is what made the inconsistency
visible in the first place.

ogc_internal_waterlevels is deliberately untouched. It carries non-public
records by design for authenticated staff clients, exactly as
ogc_internal_water_chemistry does.

Downgrade restores the definition by importing z9a0b1c2d3e4 rather than
copying its SQL, so the reverted view cannot drift from the definition of
record -- the same approach b7c8d9e0f1a2 took.

No rows change on the dev database: it has no non-public well carrying
readings today, so this closes the hole rather than retracting published
data. Whether that also holds in production is worth checking before
deploy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Serves downloadable connection and layer files from /gis so a desktop GIS user
reaches our OGC API - Features collections without configuring a connection by
hand. Two levels per client: a connections file that registers the whole
service in one import, and six curated layer files carrying symbology, field
aliases, value maps and scale visibility.

Generated rather than committed because every artifact embeds an absolute
service URL, and there are three environments times two mounts. Static files
would mean six copies of each, all going stale as collections are added --
production already advertises 30 against the 13 defined in core/pygeoapi.py.
The base URL comes from _server_url(), the same value pygeoapi stamps into its
own self/next links, so a client that imports a connection and then pages
through items never crosses hosts.

Aliases and value maps derive from core/ogc-field-descriptions.yml, the file
that already feeds /schema and /queryables, so a renamed field cannot drift
between the API and the shipped layer files. Value maps are emitted only where
the label differs from the stored value: the lexicon columns store terms that
already read as prose, and mapping them to themselves would add kilobytes of
noise per layer. trend_category is the real case -- "increasing" means the
water table is falling.

_defaults in that file is a shared pool, not a set of universal columns; it
carries well and geothermal fields side by side and describe_fields only
applies the ones a view reflects. collection_fields() does the same
intersection here, because unfiltered a nine-column collection ships aliases
for 42 fields. QGIS drops what it cannot match; ArcGIS Pro would not.

No artifact embeds a credential. Both formats allow it -- QGIS connections have
username/password attributes, CIMInternetServerConnection has a user field --
but internal access uses per-user API keys so they can be revoked per user, and
a shared file carrying one person's key defeats that.

The two EDR collections are excluded: they publish no /items endpoint and
neither client has an EDR reader, so such a layer file would not open. The
curated water-level layers use the feature collections carrying the same
measurements summarised per site.

The ArcGIS .ogc connection file is NOT generated. Esri documents where Pro
writes it but not what is in it, and it is absent from the CIM spec, so /gis
gives the two-step click path instead of shipping a guess that fails in the one
client we cannot test against.

Verification: the .qlr format was established by loading every curated layer
into a real QGIS 4.0.1 against live production -- all six load valid on the
OAPIF provider, serve live features and apply renderer, aliases, value map and
scale. Two findings are pinned by tests: a flattened value map segfaults QGIS
rather than erroring, and a curated layer must name a collection this branch
serves (the first draft of the water-level layer named one only production
has). The .lyrx files follow Esri's published CIM spec but have not been opened
in Pro; none is available here.

uv run pytest --ignore=tests/transfers -> 1140 passed, 84 skipped, 6 xpassed

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The four download routes carried response_class=PlainTextResponse, chosen for
convenience rather than accuracy. Each returns a raw Response setting its own
media_type, so OpenAPI advertised text/plain while the endpoint sent text/xml
or application/json. Harmless to a client that ignores the schema, wrong for
anything generating from it.

Rather than restate the media type in the decorator, it now comes from the
Response subclass in both places: XmlAttachment and JsonAttachment each declare
`media_type`, FastAPI reads it off `response_class` to document the operation,
and `_attachment` instantiates that same class. One definition, so the two
cannot drift apart again.

JsonAttachment deliberately subclasses Response rather than JSONResponse. The
.lyrx body is already serialised, and re-encoding it would escape the whole CIM
document into a JSON string.

test_openapi_advertises_the_content_type_actually_returned compares the
documented content type against the served one for all three download shapes;
it fails on the previous code.

uv run pytest --ignore=tests/transfers -> 1143 passed, 84 skipped, 6 xpassed

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
/gis returned HTML only, so a frontend wanting to offer these downloads had to
hardcode the six curated layer ids and reconstruct their URLs. It now
negotiates: HTML by default for a human following the link, JSON on ?f=json or
an Accept: application/json header. Same precedence as api/disclaimer.py and
pygeoapi, so the surfaces behave alike.

The payload carries the service URL, the connection file, and per layer its id,
title, abstract, backing collection, that collection's URL, geometry, renderer
kind, and one download entry per client with href, media type and filename.
Enough to build a download UI without knowing anything about this router.

Hrefs are absolute and built from _app_base_url() rather than from the request:
a browser app on another origin has to use them unchanged, and a proxy
rewriting Host must not be able to redirect the caller. Tests fetch every
advertised href and assert the media type and filename match what the download
actually sends, so the catalogue cannot drift from the files.

Also declares 404 on the two layer routes. Both already raised it for an
unknown id, but only 422 was documented, so a generated client had no case for
the error it is most likely to hit.

uv run pytest --ignore=tests/transfers -> 1148 passed, 84 skipped, 6 xpassed

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The 11 thing-type layers carried construction and location detail but no
signal of data recency: nothing distinguished a well measured last month from
one last visited in 1994 without querying a second layer.

This adds last_observation_date to the shared thing-view template -- the UTC
date of the most recent observation recorded against the thing, or NULL where
it has none -- and rebuilds all 11 public views and their ogc_internal_
counterparts from that one template so both mounts stay identical.

Scope is the observation table, reached through the sample ->
field_activity -> field_event chain every other observation-backed view here
uses. Continuous transducer readings are deliberately excluded: they hang off
deployments rather than field events, they exist for a handful of instrumented
wells rather than for Group A generally, and a max() over the largest table in
the schema would need an index of its own to stay cheap. Wells with logger
data are served by actively_monitored_wells and the water-elevation layers.

Per-thing lookup is a LEFT JOIN LATERAL so a paginated or single-feature
request touches only the observations of the rows it returns. That join path
had no indexes at all, so the four it needs come with the migration.

The behave harness needed one fix to go with this: pygeoapi caches reflected
table models process-wide, so the scenarios that downgrade the schema under a
running app were building SELECTs naming a column the downgraded views no
longer have. The cache is now cleared wherever those scenarios move the
schema.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A well's construction record says how deep the hole goes and its water-level
record says how far down the water sits, but nothing in the catalogue
published the difference -- the standing column of water in the well, which is
the number that says whether a well still holds usable water.

ogc_well_water_column (and its unfiltered ogc_internal_ twin) carries one row
per water well with the same well and location fields the water_wells layer
publishes, plus four derived depths in feet: the well depth less the latest
depth to water, less the mean depth to water, less the shallowest reading on
record, and less the deepest. Shallowest water leaves the most in the well and
deepest the least, hence maximum/minimum naming the column rather than the
reading.

Readings are manual groundwater-level observations taken below ground surface
as value minus measuring-point height, the same convention water_well_summary
and latest_depth_to_water_wells already use, so the three layers cannot
disagree about what a depth to water is. Continuous transducer readings are
not counted.

Negative results are clamped to zero: a reading deeper than the recorded well
depth is a contradiction between two records rather than a well holding
negative water. The contradiction itself stays visible in water_well_summary,
which publishes the raw shallowest and deepest readings beside the well depth.
Wells with no recorded depth, or no usable reading, are left out -- all four
columns would be NULL and the row would say nothing.

Materialized, because every column but the latest aggregates a well's whole
reading history. The nightly pg_cron job refreshes every matview in the public
schema by name, so the two are picked up with no change to the schedule, and
both carry a unique index on id so a manual refresh can run CONCURRENTLY.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…-column-layer

feat(ogc): publish a well water-column layer
…to-staging-1.2.1

chore: merge production v1.2.1 into staging
…nches--staging--components--OcotilloAPI

chore(staging): release 1.3.0-rc
Copilot AI lite review requested due to automatic review settings August 24, 2026 23:07
@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Your pull request is automatically being deployed to Dagster Cloud.

Location Status Link Updated
ocotillo-automated-ingestion View in Cloud Aug 24, 2026 at 11:22 PM (UTC)

The repo's Procfile (`web: python3 -m transfers.transfer`) existed only so a
Cloud Build trigger could buildpack-build the deprecated NM_Aquifer transfer
driver into a deployed job. That build has been failing on every staging commit
since 2026-08-21 and posts a red check on every PR, including release
promotions.

The transfer drivers are deprecated and run by hand for backfills; nothing
should build or trigger them automatically. Remove the Procfile and say so in
transfers/README.md.

The Cloud Build trigger itself lives in GCP (nma-ocotillo-transfer,
us-central1) and is deleted separately.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…-cloudbuild

chore(transfers): drop the Procfile that fed the transfer build
Copilot stopped reviewing on behalf of jirhiker due to an error August 24, 2026 23:28

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@jirhiker
jirhiker merged commit f0d56f1 into production Aug 24, 2026
15 of 16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants